@syncfusion/ej2-schedule 25.1.37 → 25.1.41

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 (65) hide show
  1. package/CHANGELOG.md +19 -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 +98 -16
  6. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  7. package/dist/es6/ej2-schedule.es5.js +107 -20
  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 +16 -3
  24. package/src/schedule/popups/event-window.js +1 -1
  25. package/src/schedule/popups/quick-popups.js +3 -1
  26. package/src/schedule/renderer/header-renderer.js +3 -2
  27. package/src/schedule/renderer/renderer.js +1 -0
  28. package/src/schedule/renderer/timeline-year.js +4 -1
  29. package/src/schedule/renderer/vertical-view.js +14 -0
  30. package/src/schedule/renderer/view-base.js +1 -1
  31. package/styles/bootstrap-dark.css +8 -1
  32. package/styles/bootstrap.css +8 -1
  33. package/styles/bootstrap4.css +8 -1
  34. package/styles/bootstrap5-dark.css +8 -1
  35. package/styles/bootstrap5.css +8 -1
  36. package/styles/fabric-dark.css +8 -1
  37. package/styles/fabric.css +8 -1
  38. package/styles/fluent-dark.css +8 -1
  39. package/styles/fluent.css +8 -1
  40. package/styles/highcontrast-light.css +8 -1
  41. package/styles/highcontrast.css +8 -1
  42. package/styles/material-dark.css +8 -1
  43. package/styles/material.css +8 -1
  44. package/styles/material3-dark.css +8 -1
  45. package/styles/material3.css +8 -1
  46. package/styles/schedule/_layout.scss +18 -1
  47. package/styles/schedule/bootstrap-dark.css +8 -1
  48. package/styles/schedule/bootstrap.css +8 -1
  49. package/styles/schedule/bootstrap4.css +8 -1
  50. package/styles/schedule/bootstrap5-dark.css +8 -1
  51. package/styles/schedule/bootstrap5.css +8 -1
  52. package/styles/schedule/fabric-dark.css +8 -1
  53. package/styles/schedule/fabric.css +8 -1
  54. package/styles/schedule/fluent-dark.css +8 -1
  55. package/styles/schedule/fluent.css +8 -1
  56. package/styles/schedule/highcontrast-light.css +8 -1
  57. package/styles/schedule/highcontrast.css +8 -1
  58. package/styles/schedule/material-dark.css +8 -1
  59. package/styles/schedule/material.css +8 -1
  60. package/styles/schedule/material3-dark.css +8 -1
  61. package/styles/schedule/material3.css +8 -1
  62. package/styles/schedule/tailwind-dark.css +8 -1
  63. package/styles/schedule/tailwind.css +8 -1
  64. package/styles/tailwind-dark.css +8 -1
  65. 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
  }
@@ -7306,9 +7319,12 @@ class VerticalEvent extends EventBase {
7306
7319
  return (tempLeft > 99 ? 99 : tempLeft) + '%';
7307
7320
  }
7308
7321
  getTopValue(date, day, resource) {
7309
- const startEndHours = getStartEndHours(resetTime(this.dateRender[parseInt(resource.toString(), 10)][parseInt(day.toString(), 10)]), this.startHour, this.endHour);
7322
+ const viewDate = resetTime(this.dateRender[parseInt(resource.toString(), 10)][parseInt(day.toString(), 10)]);
7323
+ const startEndHours = getStartEndHours(viewDate, this.startHour, this.endHour);
7310
7324
  const startHour = startEndHours.startHour;
7311
- const diffInMinutes = ((date.getHours() - startHour.getHours()) * 60) + (date.getMinutes() - startHour.getMinutes());
7325
+ const adjustedStartHour = isDaylightSavingTime(viewDate) && (startHour.getHours() !== this.startHour.getHours()) ?
7326
+ this.startHour.getHours() : startHour.getHours();
7327
+ const diffInMinutes = ((date.getHours() - adjustedStartHour) * 60) + (date.getMinutes() - startHour.getMinutes());
7312
7328
  return (this.parent.activeViewOptions.timeScale.enable) ? ((diffInMinutes * this.cellHeight * this.slotCount) / this.interval) : 0;
7313
7329
  }
7314
7330
  getOverlapIndex(record, day, isAllDay, resource) {
@@ -8174,8 +8190,7 @@ class MonthEvent extends EventBase {
8174
8190
  attrs: {
8175
8191
  'role': 'button',
8176
8192
  'tabindex': '0',
8177
- 'aria-label': this.parent.globalize.formatNumber(count) + '&nbsp;'
8178
- + (this.parent.isAdaptive ? '' : this.parent.localeObj.getConstant('more')),
8193
+ 'aria-label': this.parent.globalize.formatNumber(count) + ' ' + this.parent.localeObj.getConstant('moreEvents'),
8179
8194
  'data-count': count.toString(),
8180
8195
  'data-start-date': startDate.getTime().toString(),
8181
8196
  'data-end-date': endDate.getTime().toString()
@@ -8282,8 +8297,16 @@ class TimelineEvent extends MonthEvent {
8282
8297
  const appointments = [];
8283
8298
  for (const app of appointmentsCollection) {
8284
8299
  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())) {
8300
+ const start = resetTime(startDate).getTime();
8301
+ const end = resetTime(endDate).getTime();
8302
+ const appStart = resetTime(app[this.fields.startTime]).getTime();
8303
+ const appEnd = resetTime(app[this.fields.endTime]).getTime();
8304
+ const isEndOverlap = () => {
8305
+ let endTime = (end - (getDateInMs(endDate) <= 0 ? MS_PER_DAY : 0));
8306
+ endTime = start > endTime ? start : endTime;
8307
+ return appEnd >= endTime && appStart <= endTime;
8308
+ };
8309
+ if (appStart <= start && appEnd >= start || isEndOverlap() || appStart > start && appEnd < end) {
8287
8310
  appointments.push(app);
8288
8311
  }
8289
8312
  }
@@ -9156,7 +9179,7 @@ class QuickPopups {
9156
9179
  renderMorePopup() {
9157
9180
  const moreEventPopup = `<div class="${MORE_EVENT_POPUP_CLASS}"><div class="${MORE_EVENT_HEADER_CLASS}">` +
9158
9181
  `<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>` +
9182
+ `<div class="${MORE_EVENT_DATE_HEADER_CLASS}"><div class="${MORE_EVENT_HEADER_DAY_CLASS}" id="${this.parent.element.id}_more_popup"></div>` +
9160
9183
  `<div class="${MORE_EVENT_HEADER_DATE_CLASS} ${NAVIGATE_CLASS}" tabindex="0" role="link"></div></div></div></div>`;
9161
9184
  const moreEventWrapper = createElement('div', {
9162
9185
  className: MORE_POPUP_WRAPPER_CLASS + ' e-popup-close',
@@ -9181,6 +9204,8 @@ class QuickPopups {
9181
9204
  viewPortElement: (this.parent.isAdaptive ? document.body : this.parent.element),
9182
9205
  zIndex: (this.parent.isAdaptive ? 1002 : 2)
9183
9206
  });
9207
+ this.morePopup.element.setAttribute('role', 'dialog');
9208
+ this.morePopup.element.setAttribute('aria-labelledby', this.parent.element.id + '_more_popup');
9184
9209
  const closeButton = this.morePopup.element.querySelector('.' + MORE_EVENT_CLOSE_CLASS);
9185
9210
  this.renderButton('e-round', ICON + ' ' + CLOSE_ICON_CLASS, false, closeButton, this.closeClick);
9186
9211
  EventHandler.add(this.morePopup.element.querySelector('.' + MORE_EVENT_HEADER_DATE_CLASS), 'click', this.navigationClick, this);
@@ -12270,7 +12295,7 @@ class EventWindow {
12270
12295
  const resourceInput = this.createInputElement(value + ' ' + EVENT_FIELD$1, fieldName);
12271
12296
  resourceDiv.appendChild(resourceInput);
12272
12297
  const resourceTemplate = function (data) {
12273
- 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>`;
12298
+ return SanitizeHtmlHelper.sanitize(`<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>`);
12274
12299
  };
12275
12300
  initializeCSPTemplate(resourceTemplate, resourceData);
12276
12301
  if (resourceData.allowMultiple) {
@@ -13798,6 +13823,27 @@ class VirtualScroll {
13798
13823
  this.itemSize = getElementHeightFromClass(this.parent.activeView.element, WORK_CELLS_CLASS) || this.itemSize;
13799
13824
  }
13800
13825
  }
13826
+ refreshLayout() {
13827
+ const initialHeight = this.parent.uiStateValues.scheduleHeight;
13828
+ this.parent.uiStateValues.scheduleHeight = this.parent.element.offsetHeight;
13829
+ const preRenderedLength = this.renderedLength;
13830
+ if (this.parent.uiStateValues.scheduleHeight !== initialHeight) {
13831
+ if (preRenderedLength < this.getRenderedCount()) {
13832
+ this.isRemoteRefresh = true;
13833
+ }
13834
+ const resWrap = this.parent.element.querySelector('.' + RESOURCE_COLUMN_WRAP_CLASS);
13835
+ const conWrap = this.parent.element.querySelector('.' + CONTENT_WRAP_CLASS);
13836
+ const eventWrap = this.parent.element.querySelector('.' + EVENT_TABLE_CLASS);
13837
+ let firstTDIndex = parseInt(resWrap.querySelector('tbody td').getAttribute('data-group-index'), 10);
13838
+ const endIndex = (firstTDIndex + this.renderedLength);
13839
+ firstTDIndex = (endIndex > this.parent.resourceBase.expandedResources.length) ?
13840
+ (this.parent.resourceBase.expandedResources.length - this.renderedLength) : firstTDIndex;
13841
+ this.parent.resourceBase.renderedResources = this.parent.resourceBase.expandedResources.slice(firstTDIndex, endIndex);
13842
+ if (this.parent.resourceBase.renderedResources.length > 0) {
13843
+ this.updateContent(resWrap, conWrap, eventWrap, this.parent.resourceBase.renderedResources);
13844
+ }
13845
+ }
13846
+ }
13801
13847
  renderEvents() {
13802
13848
  this.setTabIndex();
13803
13849
  const dynamicData = this.triggerScrollEvent(virtualScrollStop);
@@ -13832,7 +13878,9 @@ class VirtualScroll {
13832
13878
  const eventWrap = this.parent.element.querySelector('.' + EVENT_TABLE_CLASS);
13833
13879
  const timeIndicator = this.parent.element.querySelector('.' + CURRENT_TIMELINE_CLASS);
13834
13880
  const conTable = this.parent.element.querySelector('.' + CONTENT_TABLE_CLASS);
13835
- addClass([conWrap], 'e-transition');
13881
+ if (!this.parent.rowAutoHeight) {
13882
+ addClass([conWrap, resWrap], 'e-transition');
13883
+ }
13836
13884
  this.renderedLength = resWrap.querySelector('tbody').children.length;
13837
13885
  const firstTDIndex = parseInt(resWrap.querySelector('tbody td').getAttribute('data-group-index'), 10);
13838
13886
  const scrollHeight = this.parent.rowAutoHeight ?
@@ -14226,6 +14274,7 @@ class Render {
14226
14274
  }
14227
14275
  throw Error('Inject required modules');
14228
14276
  }
14277
+ this.parent.uiStateValues.scheduleHeight = this.parent.element.offsetHeight;
14229
14278
  this.parent.activeView.viewIndex = this.parent.viewIndex;
14230
14279
  this.updateLabelText(viewName);
14231
14280
  this.parent.activeView.addEventListener();
@@ -15914,6 +15963,7 @@ class ResourceBase {
15914
15963
  args = {
15915
15964
  cancel: false, event: (event) ? event.event : null, groupIndex: this.parent.uiStateValues.groupIndex, requestType: 'resourceChanged'
15916
15965
  };
15966
+ this.parent.adaptiveGroupIndex = this.parent.uiStateValues.groupIndex;
15917
15967
  this.parent.trigger(actionComplete, args);
15918
15968
  }
15919
15969
  });
@@ -16570,6 +16620,7 @@ let Schedule = class Schedule extends Component {
16570
16620
  */
16571
16621
  constructor(options, element) {
16572
16622
  super(options, element);
16623
+ this.adaptiveGroupIndex = 0;
16573
16624
  }
16574
16625
  /**
16575
16626
  * Core method that initializes the control rendering.
@@ -16593,6 +16644,12 @@ let Schedule = class Schedule extends Component {
16593
16644
  else {
16594
16645
  removeClasses.push(DEVICE_CLASS);
16595
16646
  }
16647
+ if (this.enableAdaptiveUI) {
16648
+ addClasses.push(ADAPTIVE_CLASS);
16649
+ }
16650
+ else {
16651
+ removeClasses.push(ADAPTIVE_CLASS);
16652
+ }
16596
16653
  if (this.allowMultiDrag) {
16597
16654
  addClasses.push(MULTI_DRAG);
16598
16655
  }
@@ -17194,7 +17251,7 @@ let Schedule = class Schedule extends Component {
17194
17251
  if (this && isNullOrUndefined(this.uiStateValues) || !(this.enablePersistence)) {
17195
17252
  this.uiStateValues = {
17196
17253
  expand: false, isInitial: true, left: 0, top: 0, isGroupAdaptive: false,
17197
- isIgnoreOccurrence: false, groupIndex: 0, action: false, isBlock: false, isCustomMonth: true, isPreventTimezone: false
17254
+ isIgnoreOccurrence: false, groupIndex: this.adaptiveGroupIndex, action: false, isBlock: false, isCustomMonth: true, isPreventTimezone: false
17198
17255
  };
17199
17256
  }
17200
17257
  this.currentTimezoneDate = this.getCurrentTime();
@@ -17686,6 +17743,9 @@ let Schedule = class Schedule extends Component {
17686
17743
  && document.activeElement.classList.contains(SUBJECT_CLASS))) {
17687
17744
  return;
17688
17745
  }
17746
+ if (this.virtualScrollModule && this.activeView.isTimelineView()) {
17747
+ this.virtualScrollModule.refreshLayout();
17748
+ }
17689
17749
  if (this.activeViewOptions.timeScale.enable && this.activeView) {
17690
17750
  this.activeView.highlightCurrentTime();
17691
17751
  }
@@ -17697,7 +17757,12 @@ let Schedule = class Schedule extends Component {
17697
17757
  && !this.activeViewOptions.timeScale.enable) || this.activeView.isTimelineView()) {
17698
17758
  this.activeView.resetColWidth();
17699
17759
  this.notify(scrollUiUpdate, { cssProperties: this.getCssProperties(), isPreventScrollUpdate: true });
17700
- this.refreshEvents(false);
17760
+ let isRemoteRefresh = false;
17761
+ if (this.activeViewOptions.enableLazyLoading && this.virtualScrollModule && this.virtualScrollModule.isRemoteRefresh) {
17762
+ isRemoteRefresh = this.virtualScrollModule.isRemoteRefresh;
17763
+ this.virtualScrollModule.isRemoteRefresh = false;
17764
+ }
17765
+ this.refreshEvents(isRemoteRefresh);
17701
17766
  }
17702
17767
  else {
17703
17768
  this.notify(contentReady, {});
@@ -17880,7 +17945,7 @@ let Schedule = class Schedule extends Component {
17880
17945
  * @private
17881
17946
  */
17882
17947
  getPersistData() {
17883
- return this.addOnPersist(['currentView', 'selectedDate', 'scrollTop', 'scrollLeft']);
17948
+ return this.addOnPersist(['currentView', 'selectedDate', 'scrollTop', 'scrollLeft', 'adaptiveGroupIndex']);
17884
17949
  }
17885
17950
  /**
17886
17951
  * Called internally, if any of the property value changed.
@@ -22881,7 +22946,7 @@ class ViewBase {
22881
22946
  const colWidth = (getElementWidth(contentBody) / (colElements.length / 2));
22882
22947
  if (content.offsetHeight !== content.clientHeight) {
22883
22948
  const resourceColumn = this.parent.element.querySelector('.' + RESOURCE_COLUMN_WRAP_CLASS);
22884
- if (!isNullOrUndefined(resourceColumn)) {
22949
+ if (!isNullOrUndefined(resourceColumn) && resourceColumn.offsetHeight !== content.clientHeight) {
22885
22950
  setStyleAttribute(resourceColumn, { 'height': formatUnit(content.clientHeight) });
22886
22951
  }
22887
22952
  }
@@ -23698,6 +23763,20 @@ class VerticalView extends ViewBase {
23698
23763
  append(tooltipTemplate, ntd);
23699
23764
  }
23700
23765
  ntd.setAttribute('data-date', cellDate.getTime().toString());
23766
+ const skeleton = 'full';
23767
+ if (!this.parent.activeViewOptions.timeScale.enable) {
23768
+ const announcementText = this.parent.globalize.formatDate(tdData.date, { skeleton: skeleton, calendar: this.parent.getCalendarMode() });
23769
+ ntd.setAttribute('aria-label', announcementText);
23770
+ }
23771
+ else {
23772
+ const startDateText = this.parent.globalize.formatDate(cellDate, {
23773
+ type: 'dateTime', skeleton: skeleton, calendar: this.parent.getCalendarMode()
23774
+ });
23775
+ const endDateText = this.parent.globalize.formatDate(this.getEndDateFromStartDate(cellDate), {
23776
+ type: 'dateTime', skeleton: skeleton, calendar: this.parent.getCalendarMode()
23777
+ });
23778
+ ntd.setAttribute('aria-label', startDateText + ' ' + this.parent.localeObj.getConstant('endAt') + ' ' + endDateText);
23779
+ }
23701
23780
  if (!isNullOrUndefined(tdData.groupIndex) || this.parent.uiStateValues.isGroupAdaptive) {
23702
23781
  const groupIndex = this.parent.uiStateValues.isGroupAdaptive ? this.parent.uiStateValues.groupIndex :
23703
23782
  tdData.groupIndex;
@@ -26924,11 +27003,14 @@ class TimelineYear extends Year {
26924
27003
  groupIndex = this.colLevels.slice(-1)[0][parseInt(month.toString(), 10)].groupIndex;
26925
27004
  classList$$1.push(WORKDAY_CLASS);
26926
27005
  }
27006
+ const startDateText = this.parent.globalize.formatDate(date, { type: 'dateTime', skeleton: 'full', calendar: this.parent.getCalendarMode() });
27007
+ const endDateText = this.parent.globalize.formatDate(this.parent.calendarUtil.getMonthEndDate(new Date(monthDate.getTime())), { type: 'dateTime', skeleton: 'full', calendar: this.parent.getCalendarMode() });
26927
27008
  const td = createElement('td', {
26928
27009
  className: WORK_CELLS_CLASS,
26929
27010
  attrs: {
26930
27011
  'aria-selected': 'false',
26931
- 'data-date': date.getTime().toString()
27012
+ 'data-date': date.getTime().toString(),
27013
+ 'aria-label': startDateText + ' ' + this.parent.localeObj.getConstant('endAt') + ' ' + endDateText
26932
27014
  }
26933
27015
  });
26934
27016
  addClass([td], classList$$1);