@progress/kendo-angular-scheduler 21.4.0-develop.1 → 21.4.0-develop.3

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 (55) hide show
  1. package/esm2022/events/more-events-click.mjs +24 -0
  2. package/esm2022/events/navigate-event.mjs +1 -1
  3. package/esm2022/events.mjs +1 -0
  4. package/esm2022/package-metadata.mjs +2 -2
  5. package/esm2022/scheduler.component.mjs +12 -2
  6. package/esm2022/views/agenda/agenda-view-internal.component.mjs +8 -4
  7. package/esm2022/views/agenda/agenda-view.component.mjs +3 -1
  8. package/esm2022/views/agenda/tasks.collection.mjs +7 -1
  9. package/esm2022/views/agenda/utils.mjs +2 -2
  10. package/esm2022/views/common/configuration-view-base.mjs +22 -2
  11. package/esm2022/views/common/slot-selectable.directive.mjs +3 -3
  12. package/esm2022/views/day-time/day-time-slot.service.mjs +1 -0
  13. package/esm2022/views/day-time/day-time-view.component.mjs +23 -10
  14. package/esm2022/views/month/month-view-renderer.component.mjs +33 -7
  15. package/esm2022/views/month/month-view.component.mjs +17 -5
  16. package/esm2022/views/month/multi-week-view.component.mjs +3 -1
  17. package/esm2022/views/month/utils.mjs +31 -1
  18. package/esm2022/views/multi-day/day-view.component.mjs +8 -1
  19. package/esm2022/views/multi-day/multi-day-view-renderer.component.mjs +18 -8
  20. package/esm2022/views/multi-day/multi-day-view.component.mjs +16 -2
  21. package/esm2022/views/multi-day/utils.mjs +7 -1
  22. package/esm2022/views/multi-day/week-view.component.mjs +3 -1
  23. package/esm2022/views/multi-day/work-week-view.component.mjs +3 -1
  24. package/esm2022/views/timeline/timeline-month-view.component.mjs +5 -1
  25. package/esm2022/views/timeline/timeline-multi-day-view.component.mjs +14 -4
  26. package/esm2022/views/timeline/timeline-view.component.mjs +8 -1
  27. package/esm2022/views/timeline/timeline-week-view.component.mjs +3 -1
  28. package/esm2022/views/timeline/utils.mjs +7 -1
  29. package/esm2022/views/utils.mjs +25 -3
  30. package/esm2022/views/year/year-view.component.mjs +7 -0
  31. package/events/more-events-click.d.ts +23 -0
  32. package/events/navigate-event.d.ts +1 -1
  33. package/events.d.ts +1 -0
  34. package/fesm2022/progress-kendo-angular-scheduler.mjs +333 -89
  35. package/package.json +15 -15
  36. package/scheduler.component.d.ts +8 -1
  37. package/schematics/ngAdd/index.js +3 -3
  38. package/views/agenda/agenda-view-internal.component.d.ts +3 -1
  39. package/views/agenda/tasks.collection.d.ts +3 -1
  40. package/views/agenda/utils.d.ts +1 -1
  41. package/views/common/configuration-view-base.d.ts +13 -1
  42. package/views/day-time/day-time-slot.service.d.ts +2 -0
  43. package/views/day-time/day-time-view.component.d.ts +2 -1
  44. package/views/month/month-view-renderer.component.d.ts +5 -2
  45. package/views/month/month-view.component.d.ts +9 -2
  46. package/views/month/utils.d.ts +2 -1
  47. package/views/multi-day/day-view.component.d.ts +6 -0
  48. package/views/multi-day/multi-day-view-renderer.component.d.ts +4 -2
  49. package/views/multi-day/multi-day-view.component.d.ts +8 -1
  50. package/views/multi-day/utils.d.ts +2 -1
  51. package/views/timeline/timeline-multi-day-view.component.d.ts +3 -1
  52. package/views/timeline/timeline-view.component.d.ts +6 -0
  53. package/views/timeline/utils.d.ts +2 -1
  54. package/views/utils.d.ts +7 -3
  55. package/views/year/year-view.component.d.ts +6 -0
@@ -9,7 +9,7 @@ const last = (arr) => arr[arr.length - 1];
9
9
  /**
10
10
  * @hidden
11
11
  */
12
- export const createTasks = (periodStart, periodEnd, items, ranges) => {
12
+ export const createTasks = (periodStart, periodEnd, items, ranges, hiddenDays = []) => {
13
13
  const tasks = [];
14
14
  const utcStart = toUTCDate(periodStart);
15
15
  const utcEnd = toUTCDate(periodEnd);
@@ -22,6 +22,9 @@ export const createTasks = (periodStart, periodEnd, items, ranges) => {
22
22
  if (intersects(startTime, endTime, utcStart, utcEnd)) {
23
23
  for (let rangeIdx = 0; rangeIdx < ranges.length; rangeIdx++) {
24
24
  const range = ranges[rangeIdx];
25
+ if (!range[0]) {
26
+ continue;
27
+ }
25
28
  const rangeStart = toUTCDate(range[0]);
26
29
  const rangeEnd = addUTCDays(toUTCDate(last(range)), 1);
27
30
  if (intersects(startTime, endTime, rangeStart, rangeEnd)) {
@@ -38,6 +41,12 @@ export const createTasks = (periodStart, periodEnd, items, ranges) => {
38
41
  };
39
42
  task.head = task.endTime > rangeEnd;
40
43
  task.tail = task.startTime < rangeStart;
44
+ if (hiddenDays.includes(task.endTime.getDay())) {
45
+ task.head = true;
46
+ }
47
+ if (hiddenDays.includes(task.startTime.getDay())) {
48
+ task.tail = true;
49
+ }
41
50
  let slotMatch;
42
51
  range.forEach(slot => {
43
52
  const slotStartTime = slot;
@@ -47,6 +56,27 @@ export const createTasks = (periodStart, periodEnd, items, ranges) => {
47
56
  }
48
57
  });
49
58
  task.isMultiDay = task.event.end > slotMatch?.end || task.head || task.tail;
59
+ const eventStart = task.event.start;
60
+ const eventEnd = task.event.end;
61
+ let sameDate = eventStart.getFullYear() === eventEnd.getFullYear() &&
62
+ eventStart.getMonth() === eventEnd.getMonth() &&
63
+ eventStart.getDate() === eventEnd.getDate();
64
+ // Also treat as same date if end is at 00:00:00 the following day
65
+ if (!sameDate &&
66
+ eventEnd.getHours() === 0 &&
67
+ eventEnd.getMinutes() === 0 &&
68
+ eventEnd.getSeconds() === 0 &&
69
+ eventEnd.getMilliseconds() === 0) {
70
+ const nextDay = new Date(eventStart);
71
+ nextDay.setDate(nextDay.getDate() + 1);
72
+ sameDate = nextDay.getFullYear() === eventEnd.getFullYear() &&
73
+ nextDay.getMonth() === eventEnd.getMonth() &&
74
+ nextDay.getDate() === eventEnd.getDate();
75
+ }
76
+ // Skip task if it starts and ends on the same date and that date is a hidden day
77
+ if (hiddenDays?.length > 0 && sameDate && hiddenDays.includes(eventStart.getDay())) {
78
+ continue;
79
+ }
50
80
  tasks.push(task);
51
81
  }
52
82
  }
@@ -68,6 +68,13 @@ export class DayViewComponent extends MultiDayViewBase {
68
68
  * @default 'day'
69
69
  */
70
70
  name = 'day';
71
+ /**
72
+ * @hidden
73
+ * Used to override the hiddenDays as this options is not applicable for Day view.
74
+ */
75
+ set hiddenDays(_hiddenDays) {
76
+ // no-op
77
+ }
71
78
  _selectedDateFormat = '{0:D}';
72
79
  _selectedShortDateFormat = '{0:d}';
73
80
  constructor(localization, changeDetector, viewContext, viewState) {
@@ -114,7 +121,7 @@ export class DayViewComponent extends MultiDayViewBase {
114
121
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
115
122
  }
116
123
  </ng-template>
117
- `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
124
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["hiddenDays", "allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
118
125
  }
119
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DayViewComponent, decorators: [{
120
127
  type: Component,
@@ -13,7 +13,7 @@ import { DayTimeSlotService } from '../day-time/day-time-slot.service';
13
13
  import { createTasks, isMultiDay } from './utils';
14
14
  import { DayTimeViewComponent } from '../day-time/day-time-view.component';
15
15
  import { HintContainerComponent } from '../common/hint-container.component';
16
- import { toPx, dateWithTime, elementOffset, toUTCTime, toUTCDate } from '../utils';
16
+ import { toPx, dateWithTime, elementOffset, toUTCTime, toUTCDate, allDaysHidden } from '../utils';
17
17
  import { PDFService } from '../../pdf/pdf.service';
18
18
  import { ResourceIteratorPipe } from '../common/resource-iterator.pipe';
19
19
  import { ResizeHintComponent } from '../common/resize-hint.component';
@@ -33,6 +33,7 @@ import * as i7 from "@progress/kendo-angular-common";
33
33
  * @hidden
34
34
  */
35
35
  export class MultiDayViewRendererComponent extends DayTimeViewComponent {
36
+ hiddenDays;
36
37
  allDaySlot;
37
38
  name = 'day';
38
39
  slotFill;
@@ -74,12 +75,16 @@ export class MultiDayViewRendererComponent extends DayTimeViewComponent {
74
75
  if (changes.slotFill) {
75
76
  this.changes.next(null);
76
77
  }
78
+ if (changes.hiddenDays) {
79
+ this.slotService.hiddenDays = this.hiddenDays || [];
80
+ }
77
81
  if (anyChanged(['startTime', 'endTime', 'showWorkHours', 'workDayStart',
78
82
  'workDayEnd', 'workWeekStart', 'workWeekEnd', 'allDaySlot'], changes)) {
79
83
  this.viewRangeChange.next(null);
80
84
  }
81
85
  if (isChanged('numberOfDays', changes, true /* skipFirstChange */) ||
82
- isChanged('weekStart', changes)) {
86
+ isChanged('weekStart', changes) ||
87
+ isChanged('hiddenDays', changes)) {
83
88
  this.daySlots = this.createDaySlots();
84
89
  this.viewState.notifyDateRange(this.dateRange());
85
90
  }
@@ -110,6 +115,9 @@ export class MultiDayViewRendererComponent extends DayTimeViewComponent {
110
115
  });
111
116
  }
112
117
  }
118
+ isMiddleSlot(index) {
119
+ return index + 1 < this.timeSlots.length && !this.timeSlots[index + 1].isMajor;
120
+ }
113
121
  createTasks(items, dateRange) {
114
122
  const startTimeSlot = this.timeSlots[0];
115
123
  const endTimeSlot = this.timeSlots[this.timeSlots.length - 1].end;
@@ -118,13 +126,16 @@ export class MultiDayViewRendererComponent extends DayTimeViewComponent {
118
126
  start: toUTCTime(daySlot.start, startTimeSlot.start),
119
127
  end: nextDateEnd ? toUTCDate(daySlot.end) : toUTCTime(daySlot.start, endTimeSlot)
120
128
  }));
121
- return createTasks(dateRange.start, dateRange.end, items, ranges);
129
+ return createTasks(dateRange.start, dateRange.end, items, ranges, this.hiddenDays || []);
122
130
  }
123
131
  onTasksChange() {
124
132
  this.items.next(this.tasks.filter(task => !task.isAllDay));
125
133
  this.allDayItems.next(this.tasks.filter(task => task.isAllDay));
126
134
  }
127
135
  reflow() {
136
+ if (allDaysHidden(this.hiddenDays)) {
137
+ return;
138
+ }
128
139
  const slotService = this.slotService;
129
140
  if (!this.verticalResources.length) {
130
141
  this.updateContentHeight();
@@ -245,11 +256,8 @@ export class MultiDayViewRendererComponent extends DayTimeViewComponent {
245
256
  }
246
257
  return 0;
247
258
  }
248
- isMiddleSlot(index) {
249
- return index + 1 < this.timeSlots.length && !this.timeSlots[index + 1].isMajor;
250
- }
251
259
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiDayViewRendererComponent, deps: [{ token: i1.LocalizationService }, { token: i2.ViewContextService }, { token: i3.ViewStateService }, { token: i4.IntlService }, { token: i5.DayTimeSlotService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i6.PDFService }, { token: i7.ScrollbarWidthService }], target: i0.ɵɵFactoryTarget.Component });
252
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MultiDayViewRendererComponent, isStandalone: true, selector: "multi-day-view", inputs: { allDaySlot: "allDaySlot", name: "name", slotFill: "slotFill", allDaySlotTemplate: "allDaySlotTemplate", allDayEventTemplate: "allDayEventTemplate" }, providers: [
260
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MultiDayViewRendererComponent, isStandalone: true, selector: "multi-day-view", inputs: { hiddenDays: "hiddenDays", allDaySlot: "allDaySlot", name: "name", slotFill: "slotFill", allDaySlotTemplate: "allDaySlotTemplate", allDayEventTemplate: "allDayEventTemplate" }, providers: [
253
261
  DayTimeSlotService
254
262
  ], viewQueries: [{ propertyName: "headerHintContainer", first: true, predicate: ["headerHintContainer"], descendants: true }, { propertyName: "dayCells", predicate: ["allDayCell"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
255
263
  <table class="k-scheduler-layout" role="presentation" [ngClass]="classNames">
@@ -973,7 +981,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
973
981
  standalone: true,
974
982
  imports: [NgClass, NgTemplateOutlet, DaySlotDirective, DayTimeViewItemComponent, NgStyle, FocusableDirective, HintContainerComponent, ResizeHintComponent, TimeSlotDirective, ResourceIteratorPipe, DatePipe, AsyncPipe]
975
983
  }]
976
- }], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i2.ViewContextService }, { type: i3.ViewStateService }, { type: i4.IntlService }, { type: i5.DayTimeSlotService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i6.PDFService }, { type: i7.ScrollbarWidthService }], propDecorators: { allDaySlot: [{
984
+ }], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i2.ViewContextService }, { type: i3.ViewStateService }, { type: i4.IntlService }, { type: i5.DayTimeSlotService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i6.PDFService }, { type: i7.ScrollbarWidthService }], propDecorators: { hiddenDays: [{
985
+ type: Input
986
+ }], allDaySlot: [{
977
987
  type: Input
978
988
  }], name: [{
979
989
  type: Input
@@ -55,6 +55,16 @@ export class MultiDayViewComponent extends DayViewComponent {
55
55
  * @default 1
56
56
  */
57
57
  numberOfDays = 1;
58
+ /**
59
+ * Specifies the days that will be hidden from the view.
60
+ * Accepts an array of `Day` enum values.
61
+ **/
62
+ set hiddenDays(value) {
63
+ this._hiddenDays = value;
64
+ }
65
+ get hiddenDays() {
66
+ return this._hiddenDays;
67
+ }
58
68
  /**
59
69
  * @hidden
60
70
  */
@@ -78,7 +88,7 @@ export class MultiDayViewComponent extends DayViewComponent {
78
88
  super(localization, changeDetector, viewContext, viewState);
79
89
  }
80
90
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiDayViewComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.ViewContextService }, { token: i3.ViewStateService }], target: i0.ɵɵFactoryTarget.Component });
81
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MultiDayViewComponent, isStandalone: true, selector: "kendo-scheduler-multi-day-view", inputs: { selectedDateFormat: "selectedDateFormat", selectedShortDateFormat: "selectedShortDateFormat", numberOfDays: "numberOfDays" }, providers: [{
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MultiDayViewComponent, isStandalone: true, selector: "kendo-scheduler-multi-day-view", inputs: { selectedDateFormat: "selectedDateFormat", selectedShortDateFormat: "selectedShortDateFormat", numberOfDays: "numberOfDays", hiddenDays: "hiddenDays" }, providers: [{
82
92
  provide: SchedulerView,
83
93
  useExisting: forwardRef(() => MultiDayViewComponent)
84
94
  }], usesInheritance: true, ngImport: i0, template: `
@@ -87,6 +97,7 @@ export class MultiDayViewComponent extends DayViewComponent {
87
97
  viewName="day"
88
98
  [allDaySlot]="allDaySlot"
89
99
  [name]="name"
100
+ [hiddenDays]="viewHiddenDays"
90
101
  [numberOfDays]="numberOfDays"
91
102
  [eventHeight]="viewEventHeight"
92
103
  [currentTimeMarker]="viewCurrentTimeMarker"
@@ -120,7 +131,7 @@ export class MultiDayViewComponent extends DayViewComponent {
120
131
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
121
132
  }
122
133
  </ng-template>
123
- `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
134
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["hiddenDays", "allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
124
135
  }
125
136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiDayViewComponent, decorators: [{
126
137
  type: Component,
@@ -137,6 +148,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
137
148
  viewName="day"
138
149
  [allDaySlot]="allDaySlot"
139
150
  [name]="name"
151
+ [hiddenDays]="viewHiddenDays"
140
152
  [numberOfDays]="numberOfDays"
141
153
  [eventHeight]="viewEventHeight"
142
154
  [currentTimeMarker]="viewCurrentTimeMarker"
@@ -180,4 +192,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
180
192
  type: Input
181
193
  }], numberOfDays: [{
182
194
  type: Input
195
+ }], hiddenDays: [{
196
+ type: Input
183
197
  }] } });
@@ -13,7 +13,7 @@ export const isMultiDay = ({ start, end }) => {
13
13
  };
14
14
  //check start and times or update day ranges to have them
15
15
  /** @hidden */
16
- export const createTasks = (periodStart, periodEnd, items, ranges) => {
16
+ export const createTasks = (periodStart, periodEnd, items, ranges, hiddenDays = []) => {
17
17
  const tasks = [];
18
18
  const utcStart = toUTCDate(periodStart);
19
19
  const utcEnd = toUTCDate(periodEnd);
@@ -49,6 +49,12 @@ export const createTasks = (periodStart, periodEnd, items, ranges) => {
49
49
  const previousRange = ranges[rangeIndex - 1];
50
50
  task.head = (nextRange ? nextRange.start : utcEnd) < endTime;
51
51
  task.tail = startTime < (previousRange ? previousRange.end : utcStart);
52
+ if (hiddenDays.includes(task.endTime.getDay())) {
53
+ task.head = true;
54
+ }
55
+ if (hiddenDays.includes(task.startTime.getDay())) {
56
+ task.tail = true;
57
+ }
52
58
  }
53
59
  }
54
60
  }
@@ -85,6 +85,7 @@ export class WeekViewComponent extends MultiDayViewBase {
85
85
  [name]="name"
86
86
  [allDaySlot]="viewAllDaySlot"
87
87
  [numberOfDays]="7"
88
+ [hiddenDays]="viewHiddenDays"
88
89
  [getStartDate]="getStartDate"
89
90
  [eventHeight]="viewEventHeight"
90
91
  [currentTimeMarker]="viewCurrentTimeMarker"
@@ -119,7 +120,7 @@ export class WeekViewComponent extends MultiDayViewBase {
119
120
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
120
121
  }
121
122
  </ng-template>
122
- `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
123
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["hiddenDays", "allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
123
124
  }
124
125
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WeekViewComponent, decorators: [{
125
126
  type: Component,
@@ -136,6 +137,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
136
137
  [name]="name"
137
138
  [allDaySlot]="viewAllDaySlot"
138
139
  [numberOfDays]="7"
140
+ [hiddenDays]="viewHiddenDays"
139
141
  [getStartDate]="getStartDate"
140
142
  [eventHeight]="viewEventHeight"
141
143
  [currentTimeMarker]="viewCurrentTimeMarker"
@@ -77,6 +77,7 @@ export class WorkWeekViewComponent extends WeekViewComponent {
77
77
  [allDaySlot]="viewAllDaySlot"
78
78
  [name]="name"
79
79
  [numberOfDays]="numberOfDays"
80
+ [hiddenDays]="viewHiddenDays"
80
81
  [getStartDate]="getStartDate"
81
82
  [getNextDate]="getNextDate"
82
83
  [eventHeight]="viewEventHeight"
@@ -111,7 +112,7 @@ export class WorkWeekViewComponent extends WeekViewComponent {
111
112
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
112
113
  }
113
114
  </ng-template>
114
- `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
+ `, isInline: true, dependencies: [{ kind: "component", type: MultiDayViewRendererComponent, selector: "multi-day-view", inputs: ["hiddenDays", "allDaySlot", "name", "slotFill", "allDaySlotTemplate", "allDayEventTemplate"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
116
  }
116
117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WorkWeekViewComponent, decorators: [{
117
118
  type: Component,
@@ -129,6 +130,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
129
130
  [allDaySlot]="viewAllDaySlot"
130
131
  [name]="name"
131
132
  [numberOfDays]="numberOfDays"
133
+ [hiddenDays]="viewHiddenDays"
132
134
  [getStartDate]="getStartDate"
133
135
  [getNextDate]="getNextDate"
134
136
  [eventHeight]="viewEventHeight"
@@ -112,6 +112,8 @@ export class TimelineMonthViewComponent extends TimelineBase {
112
112
  <timeline-multi-day-view
113
113
  viewName="timeline-month"
114
114
  [name]="name"
115
+ [hiddenDays]="viewHiddenDays"
116
+ [numberOfDays]="31 * numberOfMonths"
115
117
  [getNextDate]="getNextDate"
116
118
  [getStartDate]="getStartDate"
117
119
  [getEndDate]="getEndDate"
@@ -145,7 +147,7 @@ export class TimelineMonthViewComponent extends TimelineBase {
145
147
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
146
148
  }
147
149
  </ng-template>
148
- `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
150
+ `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["hiddenDays", "name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
149
151
  }
150
152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineMonthViewComponent, decorators: [{
151
153
  type: Component,
@@ -161,6 +163,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
161
163
  <timeline-multi-day-view
162
164
  viewName="timeline-month"
163
165
  [name]="name"
166
+ [hiddenDays]="viewHiddenDays"
167
+ [numberOfDays]="31 * numberOfMonths"
164
168
  [getNextDate]="getNextDate"
165
169
  [getStartDate]="getStartDate"
166
170
  [getEndDate]="getEndDate"
@@ -12,7 +12,7 @@ import { createTasks, SortPipe } from './utils';
12
12
  import { toPx } from '../utils';
13
13
  import { DayTimeViewComponent } from '../day-time/day-time-view.component';
14
14
  import { PDFService } from '../../pdf/pdf.service';
15
- import { ScrollbarWidthService, isDocumentAvailable } from '@progress/kendo-angular-common';
15
+ import { ScrollbarWidthService, anyChanged, isDocumentAvailable } from '@progress/kendo-angular-common';
16
16
  import { ResourceIteratorPipe } from '../common/resource-iterator.pipe';
17
17
  import { ResizeHintComponent } from '../common/resize-hint.component';
18
18
  import { HintContainerComponent } from '../common/hint-container.component';
@@ -32,6 +32,7 @@ import * as i7 from "@progress/kendo-angular-common";
32
32
  * @hidden
33
33
  */
34
34
  export class TimelineMultiDayViewComponent extends DayTimeViewComponent {
35
+ hiddenDays;
35
36
  name = 'timeline';
36
37
  columnWidth = 100;
37
38
  viewName = 'timeline';
@@ -54,6 +55,13 @@ export class TimelineMultiDayViewComponent extends DayTimeViewComponent {
54
55
  if (changes.columnWidth) {
55
56
  this.changes.next(null);
56
57
  }
58
+ if (changes.hiddenDays) {
59
+ this.slotService.hiddenDays = this.hiddenDays || [];
60
+ }
61
+ if (anyChanged(['hiddenDays', 'numberOfDays'], changes)) {
62
+ this.daySlots = this.createDaySlots();
63
+ this.viewState.notifyDateRange(this.dateRange(this.selectedDate));
64
+ }
57
65
  super.ngOnChanges(changes);
58
66
  }
59
67
  reflow() {
@@ -113,7 +121,7 @@ export class TimelineMultiDayViewComponent extends DayTimeViewComponent {
113
121
  this.headerWrap.nativeElement.scrollLeft = this.content.nativeElement.scrollLeft;
114
122
  }
115
123
  createTasks(items, dateRange) {
116
- return createTasks(dateRange.start, dateRange.end, items);
124
+ return createTasks(dateRange.start, dateRange.end, items, this.hiddenDays || []);
117
125
  }
118
126
  onTasksChange() {
119
127
  this.items.next(this.tasks);
@@ -140,7 +148,7 @@ export class TimelineMultiDayViewComponent extends DayTimeViewComponent {
140
148
  return this.headerWrap.nativeElement.querySelector('tr:last-child').offsetTop;
141
149
  }
142
150
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineMultiDayViewComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.ViewContextService }, { token: i3.ViewStateService }, { token: i4.IntlService }, { token: i5.DayTimeSlotService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i6.PDFService }, { token: i7.ScrollbarWidthService }], target: i0.ɵɵFactoryTarget.Component });
143
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineMultiDayViewComponent, isStandalone: true, selector: "timeline-multi-day-view", inputs: { name: "name", columnWidth: "columnWidth", viewName: "viewName" }, providers: [
151
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineMultiDayViewComponent, isStandalone: true, selector: "timeline-multi-day-view", inputs: { hiddenDays: "hiddenDays", name: "name", columnWidth: "columnWidth", viewName: "viewName" }, providers: [
144
152
  DayTimeSlotService
145
153
  ], viewQueries: [{ propertyName: "headerTable", first: true, predicate: ["headerTable"], descendants: true }, { propertyName: "verticalResourceRows", predicate: ["verticalResourceRows"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
146
154
  <table class="k-scheduler-layout" [ngClass]="classNames">
@@ -624,7 +632,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
624
632
  standalone: true,
625
633
  imports: [NgClass, NgTemplateOutlet, NgStyle, TimeSlotDirective, DayTimeViewItemComponent, FocusableDirective, HintContainerComponent, ResizeHintComponent, ResourceIteratorPipe, DatePipe, AsyncPipe, SortPipe]
626
634
  }]
627
- }], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i2.ViewContextService }, { type: i3.ViewStateService }, { type: i4.IntlService }, { type: i5.DayTimeSlotService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i6.PDFService }, { type: i7.ScrollbarWidthService }], propDecorators: { name: [{
635
+ }], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i2.ViewContextService }, { type: i3.ViewStateService }, { type: i4.IntlService }, { type: i5.DayTimeSlotService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i6.PDFService }, { type: i7.ScrollbarWidthService }], propDecorators: { hiddenDays: [{
636
+ type: Input
637
+ }], name: [{
628
638
  type: Input
629
639
  }], columnWidth: [{
630
640
  type: Input
@@ -81,6 +81,13 @@ export class TimelineViewComponent extends TimelineBase {
81
81
  * @default 'timeline'
82
82
  */
83
83
  name = 'timeline';
84
+ /**
85
+ * @hidden
86
+ * Used to override the hiddenDays as this options is not applicable for Timeline view.
87
+ */
88
+ set hiddenDays(_hiddenDays) {
89
+ // no-op
90
+ }
84
91
  constructor(localization, changeDetector, viewContext, viewState) {
85
92
  super(localization, changeDetector, viewContext, viewState);
86
93
  }
@@ -123,7 +130,7 @@ export class TimelineViewComponent extends TimelineBase {
123
130
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
124
131
  }
125
132
  </ng-template>
126
- `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
133
+ `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["hiddenDays", "name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
127
134
  }
128
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineViewComponent, decorators: [{
129
136
  type: Component,
@@ -84,6 +84,7 @@ export class TimelineWeekViewComponent extends TimelineBase {
84
84
  <timeline-multi-day-view
85
85
  viewName="timeline-week"
86
86
  [name]="name"
87
+ [hiddenDays]="viewHiddenDays"
87
88
  [numberOfDays]="7 * numberOfWeeks"
88
89
  [getStartDate]="getStartDate"
89
90
  [eventHeight]="viewEventHeight"
@@ -117,7 +118,7 @@ export class TimelineWeekViewComponent extends TimelineBase {
117
118
  <div viewFooter kendoWorkHoursFooter [showWorkHours]="shouldShowWorkHours" (itemClick)="showWorkHours = !shouldShowWorkHours"></div>
118
119
  }
119
120
  </ng-template>
120
- `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
121
+ `, isInline: true, dependencies: [{ kind: "component", type: TimelineMultiDayViewComponent, selector: "timeline-multi-day-view", inputs: ["hiddenDays", "name", "columnWidth", "viewName"] }, { kind: "component", type: ViewFooterComponent, selector: "[viewFooter]", inputs: ["items"], outputs: ["itemClick"] }, { kind: "directive", type: WorkHoursFooterDirective, selector: "[kendoWorkHoursFooter]", inputs: ["showWorkHours"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
121
122
  }
122
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineWeekViewComponent, decorators: [{
123
124
  type: Component,
@@ -133,6 +134,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
133
134
  <timeline-multi-day-view
134
135
  viewName="timeline-week"
135
136
  [name]="name"
137
+ [hiddenDays]="viewHiddenDays"
136
138
  [numberOfDays]="7 * numberOfWeeks"
137
139
  [getStartDate]="getStartDate"
138
140
  [eventHeight]="viewEventHeight"
@@ -8,7 +8,7 @@ import * as i0 from "@angular/core";
8
8
  /**
9
9
  * @hidden
10
10
  */
11
- export const createTasks = (periodStart, periodEnd, items) => {
11
+ export const createTasks = (periodStart, periodEnd, items, hiddenDays = []) => {
12
12
  const tasks = [];
13
13
  const utcStart = toUTCDate(periodStart);
14
14
  const utcEnd = toUTCDate(periodEnd);
@@ -30,6 +30,12 @@ export const createTasks = (periodStart, periodEnd, items) => {
30
30
  tasks.push(task);
31
31
  task.head = task.endTime > utcEnd;
32
32
  task.tail = task.startTime < utcStart;
33
+ if (hiddenDays.includes(task.endTime.getDay())) {
34
+ task.head = true;
35
+ }
36
+ if (hiddenDays.includes(task.startTime.getDay())) {
37
+ task.tail = true;
38
+ }
33
39
  }
34
40
  }
35
41
  return tasks;
@@ -6,6 +6,17 @@ import { isEqualDate } from '@progress/kendo-date-math';
6
6
  import { formatDate } from '@progress/kendo-angular-intl';
7
7
  import { isPresent, getField, isArray, isObject, isString } from '../common/util';
8
8
  import { hasClasses } from '../common/dom-queries';
9
+ /**
10
+ * @hidden
11
+ */
12
+ export const allDaysHidden = (days) => {
13
+ for (let day = 0; day <= 6; day++) {
14
+ if (!days?.includes(day)) {
15
+ return false;
16
+ }
17
+ }
18
+ return true;
19
+ };
9
20
  /** @hidden */
10
21
  export const intersects = (startTime, endTime, periodStart, periodEnd) => (startTime < periodStart && endTime > periodEnd) ||
11
22
  (periodStart <= startTime && startTime < periodEnd) ||
@@ -203,23 +214,34 @@ export function isEmptyResource(resources) {
203
214
  /**
204
215
  * @hidden
205
216
  */
206
- export function resourcesMatch(res1, res2) {
217
+ export function resourcesMatch(res1, res2, resourceConfigs) {
207
218
  if (res1.length !== res2.length) {
208
219
  return false;
209
220
  }
210
221
  if (isEmptyResource(res1) && isEmptyResource(res2)) {
211
222
  return true;
212
223
  }
224
+ // When resource configurations are provided, use their valueField to compare
225
+ if (resourceConfigs?.length > 0) {
226
+ return res1.every((r1, index) => {
227
+ const config = resourceConfigs[index];
228
+ if (!config?.valueField) {
229
+ return res2.some(r2 => r2.value === r1.value);
230
+ }
231
+ const value1 = getField(r1, config.valueField);
232
+ return res2.some(r2 => getField(r2, config.valueField) === value1);
233
+ });
234
+ }
213
235
  return res1.every(r1 => res2.some(r2 => r2.value === r1.value));
214
236
  }
215
237
  /**
216
238
  * @hidden
217
239
  */
218
- export function isSameRange(range1, range2) {
240
+ export function isSameRange(range1, range2, resourceConfigs) {
219
241
  return (range1.start.getTime() === range2.start.getTime() &&
220
242
  range1.end.getTime() === range2.end.getTime() &&
221
243
  range1.isAllDay === range2.isAllDay &&
222
- resourcesMatch(range1.resources, range2.resources));
244
+ resourcesMatch(range1.resources, range2.resources, resourceConfigs));
223
245
  }
224
246
  /** @hidden */
225
247
  export function findRowIndex(events, data) {
@@ -56,6 +56,13 @@ export class YearViewComponent extends ConfigurationViewBase {
56
56
  * @default 'year'
57
57
  */
58
58
  name = 'year';
59
+ /**
60
+ * @hidden
61
+ * Used to override the hiddenDays as this options is not applicable for Year view.
62
+ */
63
+ set hiddenDays(_hiddenDays) {
64
+ // no-op
65
+ }
59
66
  constructor(localization, changeDetector, viewContext, viewState, intl) {
60
67
  super(localization, changeDetector, viewContext, viewState);
61
68
  this.intl = intl;
@@ -0,0 +1,23 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { PreventableEvent } from './preventable-event';
6
+ import { SchedulerEvent } from '../types';
7
+ /**
8
+ * Represents the arguments for the `moreEventsClick` event.
9
+ */
10
+ export declare class MoreEventsClickEvent extends PreventableEvent {
11
+ /**
12
+ * The events that are displayed in the day slot.
13
+ */
14
+ displayedEvents: SchedulerEvent[];
15
+ /**
16
+ * The events that are hidden from the day slot.
17
+ */
18
+ moreEvents: SchedulerEvent[];
19
+ /**
20
+ * @hidden
21
+ */
22
+ constructor();
23
+ }
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { PreventableEvent } from '@progress/kendo-angular-dateinputs';
5
+ import { PreventableEvent } from './preventable-event';
6
6
  import { SchedulerComponent } from '../scheduler.component';
7
7
  import { NavigationAction } from '../types';
8
8
  /**
package/events.d.ts CHANGED
@@ -20,6 +20,7 @@ export { DragEvent } from './events/drag-event';
20
20
  export { DragEndEvent } from './events/drag-end-event';
21
21
  export { EditEvent } from './events/edit-event';
22
22
  export { AddEvent } from './events/add-event';
23
+ export { MoreEventsClickEvent } from './events/more-events-click';
23
24
  export { SlotDragStartEvent } from './events/slot-drag-start-event';
24
25
  export { SlotDragEvent } from './events/slot-drag-event';
25
26
  export { SlotDragEndEvent } from './events/slot-drag-end-event';