@progress/kendo-angular-scheduler 21.4.1-develop.1 → 22.0.0-develop.1

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 (197) hide show
  1. package/editing/recurrence/localization/messages.d.ts +1 -1
  2. package/editing/resource-editor-base.d.ts +1 -1
  3. package/editing-directives/editing-directive-base.d.ts +1 -1
  4. package/fesm2022/progress-kendo-angular-scheduler.mjs +313 -313
  5. package/localization/messages.d.ts +1 -1
  6. package/package.json +20 -28
  7. package/schematics/ngAdd/index.js +3 -3
  8. package/views/common/base-view.d.ts +1 -1
  9. package/views/common/configuration-view-base.d.ts +1 -1
  10. package/views/day-time/day-time-view-base.d.ts +1 -1
  11. package/views/day-time/day-time-view.component.d.ts +1 -1
  12. package/views/multi-day/multi-day-view-base.d.ts +1 -1
  13. package/views/timeline/timeline-base.d.ts +1 -1
  14. package/views/view-items/base-slot.directive.d.ts +1 -1
  15. package/views/view-items/base-view-item.d.ts +1 -1
  16. package/esm2022/common/constants.mjs +0 -8
  17. package/esm2022/common/default-model-fields.mjs +0 -20
  18. package/esm2022/common/dom-queries.mjs +0 -107
  19. package/esm2022/common/modifiers.mjs +0 -31
  20. package/esm2022/common/util.mjs +0 -227
  21. package/esm2022/data-binding.directive.mjs +0 -162
  22. package/esm2022/directives.mjs +0 -136
  23. package/esm2022/editing/date-time-picker.component.mjs +0 -190
  24. package/esm2022/editing/dialogs.service.mjs +0 -96
  25. package/esm2022/editing/edit-dialog-template.directive.mjs +0 -53
  26. package/esm2022/editing/edit-dialog.component.mjs +0 -679
  27. package/esm2022/editing/edit.service.mjs +0 -107
  28. package/esm2022/editing/local-data-changes.service.mjs +0 -18
  29. package/esm2022/editing/recurrence/end-rule-radio-button.directive.mjs +0 -77
  30. package/esm2022/editing/recurrence/localization/custom-messages.component.mjs +0 -44
  31. package/esm2022/editing/recurrence/localization/localized-messages.directive.mjs +0 -39
  32. package/esm2022/editing/recurrence/localization/messages.mjs +0 -239
  33. package/esm2022/editing/recurrence/localization/recurrence-localization.service.mjs +0 -47
  34. package/esm2022/editing/recurrence/recurrence-editor.component.mjs +0 -497
  35. package/esm2022/editing/recurrence/recurrence-end-rule-editor.component.mjs +0 -334
  36. package/esm2022/editing/recurrence/recurrence-frequency-editor.component.mjs +0 -105
  37. package/esm2022/editing/recurrence/recurrence-interval-editor.component.mjs +0 -169
  38. package/esm2022/editing/recurrence/recurrence-monthly-yearly-editor.component.mjs +0 -468
  39. package/esm2022/editing/recurrence/recurrence-weekday-rule-editor.component.mjs +0 -138
  40. package/esm2022/editing/recurrence/recurrence.service.mjs +0 -254
  41. package/esm2022/editing/recurrence/repeat-on-radio-button.directive.mjs +0 -81
  42. package/esm2022/editing/resource-editor-base.mjs +0 -59
  43. package/esm2022/editing/resource-multiple-editor.component.mjs +0 -101
  44. package/esm2022/editing/resource-single-editor.component.mjs +0 -82
  45. package/esm2022/editing/timezone-editor.component.mjs +0 -193
  46. package/esm2022/editing-directives/base-edit.service.mjs +0 -320
  47. package/esm2022/editing-directives/edit-service.interface.mjs +0 -5
  48. package/esm2022/editing-directives/editing-directive-base.mjs +0 -242
  49. package/esm2022/editing-directives/local-edit.service.mjs +0 -122
  50. package/esm2022/editing-directives/reactive-editing.directive.mjs +0 -132
  51. package/esm2022/editing-directives/utils.mjs +0 -107
  52. package/esm2022/events/add-event.mjs +0 -26
  53. package/esm2022/events/cancel-event.mjs +0 -14
  54. package/esm2022/events/create-event.mjs +0 -40
  55. package/esm2022/events/date-change-event.mjs +0 -29
  56. package/esm2022/events/drag-end-event.mjs +0 -46
  57. package/esm2022/events/drag-event.mjs +0 -54
  58. package/esm2022/events/drag-start-event.mjs +0 -30
  59. package/esm2022/events/edit-event-base.mjs +0 -32
  60. package/esm2022/events/edit-event.mjs +0 -30
  61. package/esm2022/events/event-click-event.mjs +0 -32
  62. package/esm2022/events/event-keydown-event.mjs +0 -28
  63. package/esm2022/events/more-events-click.mjs +0 -24
  64. package/esm2022/events/navigate-event.mjs +0 -26
  65. package/esm2022/events/preventable-event.mjs +0 -28
  66. package/esm2022/events/remove-event.mjs +0 -30
  67. package/esm2022/events/resize-end-event.mjs +0 -38
  68. package/esm2022/events/resize-event.mjs +0 -46
  69. package/esm2022/events/resize-start-event.mjs +0 -30
  70. package/esm2022/events/save-event.mjs +0 -18
  71. package/esm2022/events/slot-click-event.mjs +0 -44
  72. package/esm2022/events/slot-drag-end-event.mjs +0 -10
  73. package/esm2022/events/slot-drag-event.mjs +0 -40
  74. package/esm2022/events/slot-drag-start-event.mjs +0 -44
  75. package/esm2022/events/view-event-map.mjs +0 -35
  76. package/esm2022/events.mjs +0 -27
  77. package/esm2022/index.mjs +0 -83
  78. package/esm2022/loading.component.mjs +0 -52
  79. package/esm2022/localization/custom-messages.component.mjs +0 -56
  80. package/esm2022/localization/localized-messages.directive.mjs +0 -39
  81. package/esm2022/localization/messages.mjs +0 -614
  82. package/esm2022/localization/scheduler-localization.service.mjs +0 -31
  83. package/esm2022/navigation/focus-position.interface.mjs +0 -5
  84. package/esm2022/navigation/focus.service.mjs +0 -202
  85. package/esm2022/navigation/focusable-element.interface.mjs +0 -5
  86. package/esm2022/navigation/focusable.directive.mjs +0 -98
  87. package/esm2022/navigation/shortcuts.directive.mjs +0 -239
  88. package/esm2022/navigation.mjs +0 -6
  89. package/esm2022/package-metadata.mjs +0 -16
  90. package/esm2022/pdf/pdf-command.directive.mjs +0 -96
  91. package/esm2022/pdf/pdf-export-event.mjs +0 -10
  92. package/esm2022/pdf/pdf.component.mjs +0 -241
  93. package/esm2022/pdf/pdf.module.mjs +0 -42
  94. package/esm2022/pdf/pdf.service.mjs +0 -36
  95. package/esm2022/progress-kendo-angular-scheduler.mjs +0 -8
  96. package/esm2022/scheduler.component.mjs +0 -1981
  97. package/esm2022/scheduler.module.mjs +0 -138
  98. package/esm2022/toolbar/navigation.component.mjs +0 -391
  99. package/esm2022/toolbar/toolbar-context.mjs +0 -5
  100. package/esm2022/toolbar/toolbar-template.directive.mjs +0 -50
  101. package/esm2022/toolbar/toolbar.component.mjs +0 -168
  102. package/esm2022/toolbar/toolbar.service.mjs +0 -46
  103. package/esm2022/toolbar/view-selector.component.mjs +0 -181
  104. package/esm2022/types/actions.mjs +0 -5
  105. package/esm2022/types/create-form-group-args.interface.mjs +0 -5
  106. package/esm2022/types/crud-operation.enum.mjs +0 -18
  107. package/esm2022/types/current-time-settings.interface.mjs +0 -5
  108. package/esm2022/types/date-range.interface.mjs +0 -5
  109. package/esm2022/types/datepicker-options.interface.mjs +0 -5
  110. package/esm2022/types/edit-event-args.interface.mjs +0 -5
  111. package/esm2022/types/edit-mode.enum.mjs +0 -23
  112. package/esm2022/types/editable-settings.interface.mjs +0 -5
  113. package/esm2022/types/event-style-args.interface.mjs +0 -5
  114. package/esm2022/types/focusable-container.mjs +0 -5
  115. package/esm2022/types/group.interface.mjs +0 -5
  116. package/esm2022/types/numeric-options.interface.mjs +0 -5
  117. package/esm2022/types/ongoing-events-settings.interface.mjs +0 -5
  118. package/esm2022/types/resource.interface.mjs +0 -5
  119. package/esm2022/types/scheduler-event.mjs +0 -5
  120. package/esm2022/types/scheduler-model-fields.interface.mjs +0 -5
  121. package/esm2022/types/scheduler-slot.interface.mjs +0 -5
  122. package/esm2022/types/scheduler-view.mjs +0 -9
  123. package/esm2022/types/slot-class-args.interface.mjs +0 -5
  124. package/esm2022/types/slot-selection.mjs +0 -35
  125. package/esm2022/types/view-item.interface.mjs +0 -5
  126. package/esm2022/types.mjs +0 -12
  127. package/esm2022/views/agenda/agenda-header-item.component.mjs +0 -85
  128. package/esm2022/views/agenda/agenda-header.component.mjs +0 -75
  129. package/esm2022/views/agenda/agenda-task-item.component.mjs +0 -137
  130. package/esm2022/views/agenda/agenda-view-internal.component.mjs +0 -424
  131. package/esm2022/views/agenda/agenda-view-list.component.mjs +0 -256
  132. package/esm2022/views/agenda/agenda-view.component.mjs +0 -130
  133. package/esm2022/views/agenda/tasks.collection.mjs +0 -96
  134. package/esm2022/views/agenda/utils.mjs +0 -176
  135. package/esm2022/views/common/base-view.mjs +0 -1099
  136. package/esm2022/views/common/configuration-view-base.mjs +0 -164
  137. package/esm2022/views/common/dom-events.service.mjs +0 -22
  138. package/esm2022/views/common/hint-container.component.mjs +0 -41
  139. package/esm2022/views/common/repeat.pipe.mjs +0 -36
  140. package/esm2022/views/common/resize-hint.component.mjs +0 -97
  141. package/esm2022/views/common/resource-iterator.pipe.mjs +0 -49
  142. package/esm2022/views/common/scheduler-task.mjs +0 -5
  143. package/esm2022/views/common/slot-selectable.directive.mjs +0 -137
  144. package/esm2022/views/common/view-footer.component.mjs +0 -103
  145. package/esm2022/views/common/work-hours-footer.directive.mjs +0 -45
  146. package/esm2022/views/constants.mjs +0 -31
  147. package/esm2022/views/day-time/day-time-slot.service.mjs +0 -633
  148. package/esm2022/views/day-time/day-time-view-base.mjs +0 -244
  149. package/esm2022/views/day-time/day-time-view-item.component.mjs +0 -216
  150. package/esm2022/views/day-time/day-time-view.component.mjs +0 -437
  151. package/esm2022/views/day-time/event-slot.directive.mjs +0 -138
  152. package/esm2022/views/day-time/utils.mjs +0 -32
  153. package/esm2022/views/month/month-slot.component.mjs +0 -166
  154. package/esm2022/views/month/month-slot.service.mjs +0 -404
  155. package/esm2022/views/month/month-view-item.component.mjs +0 -161
  156. package/esm2022/views/month/month-view-renderer.component.mjs +0 -683
  157. package/esm2022/views/month/month-view.component.mjs +0 -203
  158. package/esm2022/views/month/multi-week-view.component.mjs +0 -202
  159. package/esm2022/views/month/utils.mjs +0 -107
  160. package/esm2022/views/multi-day/day-view.component.mjs +0 -186
  161. package/esm2022/views/multi-day/multi-day-view-base.mjs +0 -55
  162. package/esm2022/views/multi-day/multi-day-view-renderer.component.mjs +0 -1002
  163. package/esm2022/views/multi-day/multi-day-view.component.mjs +0 -197
  164. package/esm2022/views/multi-day/utils.mjs +0 -63
  165. package/esm2022/views/multi-day/week-view.component.mjs +0 -189
  166. package/esm2022/views/multi-day/work-week-view.component.mjs +0 -172
  167. package/esm2022/views/scheduler-view.directive.mjs +0 -65
  168. package/esm2022/views/templates/agenda-date-template.directive.mjs +0 -41
  169. package/esm2022/views/templates/agenda-time-template.directive.mjs +0 -46
  170. package/esm2022/views/templates/all-day-event-template.directive.mjs +0 -42
  171. package/esm2022/views/templates/all-day-slot-template.directive.mjs +0 -42
  172. package/esm2022/views/templates/date-header-template.directive.mjs +0 -42
  173. package/esm2022/views/templates/event-template.directive.mjs +0 -42
  174. package/esm2022/views/templates/group-header-template.directive.mjs +0 -42
  175. package/esm2022/views/templates/major-time-header-template.directive.mjs +0 -41
  176. package/esm2022/views/templates/minor-time-header-template.directive.mjs +0 -41
  177. package/esm2022/views/templates/month-day-slot-template.directive.mjs +0 -42
  178. package/esm2022/views/templates/multi-week-day-slot-template.directive.mjs +0 -42
  179. package/esm2022/views/templates/time-slot-template.directive.mjs +0 -43
  180. package/esm2022/views/templates.mjs +0 -16
  181. package/esm2022/views/timeline/timeline-base.mjs +0 -39
  182. package/esm2022/views/timeline/timeline-month-view.component.mjs +0 -211
  183. package/esm2022/views/timeline/timeline-multi-day-view.component.mjs +0 -649
  184. package/esm2022/views/timeline/timeline-view.component.mjs +0 -189
  185. package/esm2022/views/timeline/timeline-week-view.component.mjs +0 -181
  186. package/esm2022/views/timeline/utils.mjs +0 -60
  187. package/esm2022/views/utils.mjs +0 -373
  188. package/esm2022/views/view-context.service.mjs +0 -111
  189. package/esm2022/views/view-items/base-slot.directive.mjs +0 -104
  190. package/esm2022/views/view-items/base-slot.service.mjs +0 -82
  191. package/esm2022/views/view-items/base-view-item.mjs +0 -194
  192. package/esm2022/views/view-items/item-map.mjs +0 -38
  193. package/esm2022/views/view-items/types.mjs +0 -5
  194. package/esm2022/views/view-state.service.mjs +0 -144
  195. package/esm2022/views/year/utils.mjs +0 -60
  196. package/esm2022/views/year/year-view-internal.component.mjs +0 -471
  197. package/esm2022/views/year/year-view.component.mjs +0 -136
@@ -1,166 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- import { Input, ElementRef, Component, ChangeDetectorRef } from '@angular/core';
6
- import { LocalizationService } from '@progress/kendo-angular-l10n';
7
- import { BaseSlotDirective } from '../view-items/base-slot.directive';
8
- import { MonthSlotService } from './month-slot.service';
9
- import { firstElementChild } from '../../common/dom-queries';
10
- import { addUTCDays, toUTCDate } from '../utils';
11
- import { firstDayOfMonth, isEqualDate } from '@progress/kendo-date-math';
12
- import { moreHorizontalIcon } from '@progress/kendo-svg-icons';
13
- import { DatePipe } from '@progress/kendo-angular-intl';
14
- import { IconWrapperComponent } from '@progress/kendo-angular-icons';
15
- import { NgTemplateOutlet } from '@angular/common';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "./month-slot.service";
18
- import * as i2 from "@progress/kendo-angular-l10n";
19
- /**
20
- * @hidden
21
- */
22
- export class MonthSlotComponent extends BaseSlotDirective {
23
- cdr;
24
- style;
25
- showMoreButton;
26
- moreHorizontalIcon = moreHorizontalIcon;
27
- resourcesByIndex;
28
- monthDaySlotTemplateRef;
29
- eventsPerDay;
30
- eventHeight;
31
- adaptiveSlotHeight;
32
- set day(value) {
33
- this._day = value;
34
- this.start = value;
35
- }
36
- /**
37
- * For the slot template we need the day value without the UTC conversion
38
- * - timezone does not matter for the day part in this case as the calendar month view is the same for every timezone
39
- * otherwise the date is incorrect for some timezones (e.g. LA timezone) -
40
- * For example, it displays Feb. 8, 2023 to be Thursday, wherease it is Wednesday
41
- */
42
- get day() {
43
- return this._day;
44
- }
45
- set start(value) {
46
- this.startDate = toUTCDate(value);
47
- }
48
- get start() {
49
- return this.startDate;
50
- }
51
- isDaySlot = true;
52
- get end() {
53
- return addUTCDays(this.start, 1);
54
- }
55
- isFirstDayOfMonth(day) {
56
- return isEqualDate(day, firstDayOfMonth(day));
57
- }
58
- get linkHeight() {
59
- if (this._linkHeight === null) {
60
- const element = firstElementChild(this.nativeElement);
61
- this._linkHeight = element ? element.offsetHeight + element.offsetTop : 0;
62
- }
63
- return this._linkHeight;
64
- }
65
- startDate;
66
- _day;
67
- _linkHeight = null;
68
- constructor(element, slotService, localization, cdr) {
69
- super(element, slotService, localization);
70
- this.cdr = cdr;
71
- }
72
- ngOnDestroy() {
73
- super.ngOnDestroy();
74
- this.removeShowMore();
75
- }
76
- showMore(rect) {
77
- this.showMoreButton = true;
78
- this.style = `width: ${rect.width}px; left: ${rect.left}px; top: ${rect.top}px; border-color: inherit;`;
79
- this.cdr.detectChanges();
80
- }
81
- hideMore() {
82
- this.showMoreButton = false;
83
- this.removeShowMore();
84
- }
85
- invalidate() {
86
- super.invalidate();
87
- this._linkHeight = null;
88
- this.showMoreButton = false;
89
- this.removeShowMore();
90
- }
91
- removeShowMore() {
92
- this.showMoreButton = false;
93
- this.cdr.detectChanges();
94
- }
95
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonthSlotComponent, deps: [{ token: i0.ElementRef }, { token: i1.MonthSlotService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
96
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MonthSlotComponent, isStandalone: true, selector: "[monthSlot]", inputs: { resourcesByIndex: "resourcesByIndex", monthDaySlotTemplateRef: "monthDaySlotTemplateRef", eventsPerDay: "eventsPerDay", eventHeight: "eventHeight", adaptiveSlotHeight: "adaptiveSlotHeight", day: ["monthSlot", "day"] }, usesInheritance: true, ngImport: i0, template: `
97
- @if (!monthDaySlotTemplateRef) {
98
- <span aria-hidden="true" class="k-link k-nav-day">
99
- {{ day | kendoDate: isFirstDayOfMonth(day) ? 'MMM dd' : 'dd' }}
100
- </span>
101
- }
102
- @if (monthDaySlotTemplateRef) {
103
- <ng-container
104
- [ngTemplateOutlet]="monthDaySlotTemplateRef"
105
- [ngTemplateOutletContext]="{ date: day, resources: resourcesByIndex }"
106
- >
107
- </ng-container>
108
- }
109
-
110
- @if (showMoreButton) {
111
- <div class="k-more-events k-button" [style]="style">
112
- <kendo-icon-wrapper
113
- name="more-horizontal"
114
- [svgIcon]="moreHorizontalIcon"
115
- >
116
- </kendo-icon-wrapper>
117
- </div>
118
- }
119
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "pipe", type: DatePipe, name: "kendoDate" }] });
120
- }
121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MonthSlotComponent, decorators: [{
122
- type: Component,
123
- args: [{
124
- // eslint-disable-next-line @angular-eslint/directive-selector
125
- selector: '[monthSlot]',
126
- template: `
127
- @if (!monthDaySlotTemplateRef) {
128
- <span aria-hidden="true" class="k-link k-nav-day">
129
- {{ day | kendoDate: isFirstDayOfMonth(day) ? 'MMM dd' : 'dd' }}
130
- </span>
131
- }
132
- @if (monthDaySlotTemplateRef) {
133
- <ng-container
134
- [ngTemplateOutlet]="monthDaySlotTemplateRef"
135
- [ngTemplateOutletContext]="{ date: day, resources: resourcesByIndex }"
136
- >
137
- </ng-container>
138
- }
139
-
140
- @if (showMoreButton) {
141
- <div class="k-more-events k-button" [style]="style">
142
- <kendo-icon-wrapper
143
- name="more-horizontal"
144
- [svgIcon]="moreHorizontalIcon"
145
- >
146
- </kendo-icon-wrapper>
147
- </div>
148
- }
149
- `,
150
- standalone: true,
151
- imports: [NgTemplateOutlet, IconWrapperComponent, DatePipe]
152
- }]
153
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.MonthSlotService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }], propDecorators: { resourcesByIndex: [{
154
- type: Input
155
- }], monthDaySlotTemplateRef: [{
156
- type: Input
157
- }], eventsPerDay: [{
158
- type: Input
159
- }], eventHeight: [{
160
- type: Input
161
- }], adaptiveSlotHeight: [{
162
- type: Input
163
- }], day: [{
164
- type: Input,
165
- args: ['monthSlot']
166
- }] } });
@@ -1,404 +0,0 @@
1
- /**-----------------------------------------------------------------------------------------
2
- * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
- * Licensed under commercial license. See LICENSE.md in the project root for more information
4
- *-------------------------------------------------------------------------------------------*/
5
- import { orderBy } from '@progress/kendo-data-query';
6
- import { intersects, findRowIndex, addUTCDays, rectContains, dateWithTime } from '../utils';
7
- import { ItemMap } from '../view-items/item-map';
8
- import { BaseSlotService } from '../view-items/base-slot.service';
9
- import { BORDER_WIDTH, DEFAULT_EVENT_HEIGHT, EVENT_SPACING, MORE_BUTTON_HEIGHT } from '../constants';
10
- /**
11
- * @hidden
12
- */
13
- export class SlotRange {
14
- index;
15
- get slots() {
16
- return this.slotMap.toArray();
17
- }
18
- get items() {
19
- return this.itemMap.toArray();
20
- }
21
- slotMap = new ItemMap();
22
- itemMap = new ItemMap();
23
- get start() {
24
- const first = this.slotMap.first;
25
- if (!first) {
26
- return null;
27
- }
28
- return first.start;
29
- }
30
- get end() {
31
- const last = this.slotMap.last;
32
- if (!last) {
33
- return null;
34
- }
35
- return addUTCDays(last.end, 1);
36
- }
37
- get hasSlots() {
38
- return this.slotMap.count > 0;
39
- }
40
- get hasItems() {
41
- return this.itemMap.count > 0;
42
- }
43
- get firstSlot() {
44
- return this.slotMap.first;
45
- }
46
- get lastSlot() {
47
- return this.slotMap.last;
48
- }
49
- get rect() {
50
- const first = this.firstSlot.rect;
51
- const last = this.lastSlot.rect;
52
- return {
53
- left: first.left,
54
- top: first.top,
55
- width: last.left - first.left + last.width,
56
- height: last.top - first.top + last.height
57
- };
58
- }
59
- constructor(index) {
60
- this.index = index;
61
- }
62
- registerItem(component) {
63
- this.itemMap.addItem(component.item.index, component);
64
- }
65
- unregisterItem(component, index) {
66
- this.itemMap.removeItem(index, component);
67
- }
68
- registerSlot(slot) {
69
- this.slotMap.addItem(slot.id.index, slot);
70
- }
71
- unregisterSlot(slot) {
72
- this.slotMap.removeItem(slot.id.index, slot);
73
- }
74
- layout(eventHeight, eventsPerDay, adaptiveSlotHeight) {
75
- const dateHeader = this.slots[0].element.nativeElement.firstElementChild;
76
- if (!this.hasItems) {
77
- if (eventHeight !== 'auto') {
78
- const eventsTotalHeight = adaptiveSlotHeight ? eventHeight : eventHeight * eventsPerDay;
79
- const height = (eventsTotalHeight + EVENT_SPACING) + dateHeader.offsetHeight + MORE_BUTTON_HEIGHT + EVENT_SPACING;
80
- this.slots.forEach(slot => {
81
- slot.height = height;
82
- slot.element.nativeElement.style.height = height + 'px';
83
- });
84
- }
85
- return;
86
- }
87
- const items = this.items;
88
- const sorted = orderBy(items, [{ field: "item.startTime", dir: "asc" }, { field: "item.endTime", dir: "desc" }]);
89
- const slotItems = {};
90
- const slots = this.slots;
91
- sorted.forEach(event => slots
92
- .filter(slot => intersects(event.item.startTime, event.item.endTime, slot.start, slot.end))
93
- .forEach(slot => {
94
- const value = slotItems[slot.key] = slotItems[slot.key] || { events: [], height: slot.linkHeight };
95
- value.slot = slot;
96
- const rect = slot.rect;
97
- const data = event.item.data[event.resourceIndex];
98
- data.rowIndex = findRowIndex(value.events, data);
99
- let showMore;
100
- const _eventHeight = eventHeight === 'auto' ? DEFAULT_EVENT_HEIGHT : eventHeight;
101
- if (eventHeight === 'auto' || eventsPerDay) {
102
- showMore = eventsPerDay && eventsPerDay !== 'auto' && data.rowIndex >= eventsPerDay;
103
- }
104
- else {
105
- showMore = value.height + _eventHeight + EVENT_SPACING + MORE_BUTTON_HEIGHT > rect.height || data.hidden;
106
- }
107
- if (showMore) {
108
- data.hidden = true;
109
- // Needed for when eventHeight is 'auto' in order to render the button at later point
110
- slot.hasShowMore = true;
111
- // If eventHeight is 'auto', showMore button needs to be displayed after slot accumulated height is calculated
112
- if (eventHeight !== 'auto') {
113
- slot.showMore({ width: rect.width, left: rect.left, top: rect.top + slot.linkHeight + ((data.rowIndex) * (eventHeight + EVENT_SPACING)) });
114
- }
115
- }
116
- else {
117
- if (eventHeight === 'auto') {
118
- // If multiday event spanning on new row (group), it will be rendered on top (1st item)
119
- // for simplicity and for consistency with jQuery's implementation
120
- if (event.item.tail) {
121
- event.item.data[event.resourceIndex].rowIndex = 0;
122
- }
123
- if (value.events[data.rowIndex]) {
124
- event.item.data[event.resourceIndex].rowIndex = value.events.length;
125
- }
126
- }
127
- value.events[data.rowIndex] = event;
128
- if (eventHeight !== 'auto') {
129
- // eventHeight is fixed => each event can be rendered on the go
130
- if (!event.rect) {
131
- event.rect = {
132
- top: rect.top + slot.linkHeight + (data.rowIndex * (eventHeight + EVENT_SPACING)),
133
- left: rect.left,
134
- height: eventHeight,
135
- width: 0
136
- };
137
- }
138
- event.rect.width += rect.width + BORDER_WIDTH;
139
- value.height += eventHeight + EVENT_SPACING;
140
- // Calculate tha actual rendered items to be able to calculate the height
141
- if (adaptiveSlotHeight) {
142
- slots.forEach(_slot => {
143
- if (_slot.key === slot.key) {
144
- _slot.eventsCount = !_slot.eventsCount || data.rowIndex + 1 > _slot.eventsCount ? data.rowIndex + 1 : _slot.eventsCount;
145
- }
146
- });
147
- }
148
- }
149
- }
150
- }));
151
- if (eventHeight === 'auto') {
152
- // eventHeight is 'auto' => first get all slotItems for a slot and then render them, after they are in the correct rendering order (L140-L146)
153
- this.renderAutoHeightEvents(slotItems, dateHeader);
154
- }
155
- else if (eventsPerDay) {
156
- slots.forEach(slot => {
157
- const multiplier = !adaptiveSlotHeight ? eventsPerDay : slot.eventsCount;
158
- const height = BORDER_WIDTH +
159
- dateHeader.offsetHeight +
160
- EVENT_SPACING +
161
- (multiplier * (eventHeight + EVENT_SPACING)) +
162
- MORE_BUTTON_HEIGHT +
163
- EVENT_SPACING;
164
- slot.eventsCount = 0;
165
- slot.height = height;
166
- slot.element.nativeElement.style.height = height + 'px';
167
- });
168
- }
169
- sorted.forEach(event => {
170
- if (event.rect) {
171
- event.rect.width -= BORDER_WIDTH;
172
- }
173
- event.reflow();
174
- });
175
- }
176
- renderAutoHeightEvents(slotItems, dateHeader) {
177
- // Iterate through the slotItems
178
- Object.keys(slotItems).forEach((key) => {
179
- const slotItem = slotItems[key];
180
- const slotRect = slotItem.slot.rect;
181
- // Iterate over each event in the events array
182
- let accumulatedHeight = dateHeader.offsetHeight;
183
- slotItem.events.forEach((event, index) => {
184
- const prevEvent = slotItem.events[index - 1];
185
- if (!event.rect) {
186
- // Each event is position depending on where the previous event is already positioned
187
- const eventOffset = !prevEvent ? 0 : prevEvent.element.nativeElement.clientHeight + prevEvent.rect.top;
188
- const top = !prevEvent ? slotRect.top + slotItem.slot.linkHeight : eventOffset + EVENT_SPACING;
189
- event.rect = {
190
- top: top,
191
- left: slotRect.left,
192
- width: 0
193
- };
194
- }
195
- // The number of slots an event spans in current group
196
- const eventWidth = this.calculateEventWidth(event, prevEvent, slotItems, key, slotRect);
197
- event.rect.width = eventWidth;
198
- event.element.nativeElement.style.width = event.rect.width + 'px';
199
- event.element.nativeElement.style.height = 'auto';
200
- accumulatedHeight += event.element.nativeElement.clientHeight + EVENT_SPACING;
201
- });
202
- const slotHeight = slotItem.height = BORDER_WIDTH +
203
- dateHeader.offsetHeight +
204
- EVENT_SPACING +
205
- accumulatedHeight +
206
- (slotItem.slot.hasShowMore ? 0 : MORE_BUTTON_HEIGHT);
207
- slotItem.slot.element.nativeElement.style.height = slotHeight + 'px';
208
- // After events are rendered, position the showMore button
209
- if (slotItem.slot.hasShowMore) {
210
- const top = slotRect.top + slotItem.slot.linkHeight + accumulatedHeight - MORE_BUTTON_HEIGHT;
211
- slotItem.slot.showMore({ width: slotRect.width, left: slotRect.left, top: top });
212
- }
213
- });
214
- }
215
- /**
216
- * Extracted to a separate method to address SonarQube suggestion:
217
- * "Refactor this code to not nest functions more than 4 levels deep"
218
- */
219
- calculateEventWidth = (event, prevEvent, slotItems, key, slotRect) => {
220
- let eventWidth;
221
- if (event.item.isMultiDay) {
222
- const slotMatch = this.slots.filter(slot => intersects(event.item.startTime, event.item.endTime, slot.start, slot.end));
223
- eventWidth = slotMatch.reduce((acc, currentValue) => acc + currentValue.rect.width + BORDER_WIDTH, 0) - BORDER_WIDTH;
224
- if (prevEvent) {
225
- const newHeight = prevEvent.element.nativeElement.clientHeight + prevEvent.rect.top;
226
- const newTop = newHeight + EVENT_SPACING;
227
- // If event is spanning in multiple slots, it needs to be positioned so that its top
228
- // is calculated based on the most 'accumulated height' among all slots
229
- if (event.rect.top < newTop) {
230
- event.rect.top = newTop;
231
- // Consequently, all previously renderd events (after that multi-span event) need to
232
- // be reposition so that they don't overlap
233
- slotMatch.forEach(slot => {
234
- const slotKey = slot.id.resourceIndex + ':' + slot.id.rangeIndex + ':' + slot.id.index;
235
- if (slotKey !== key) {
236
- slotItems[slotKey].events.forEach((e, index) => {
237
- if (index > event.item.data[event.resourceIndex].rowIndex) {
238
- e.rect.top = event.rect.top + event.element.nativeElement.clientHeight + EVENT_SPACING;
239
- }
240
- });
241
- }
242
- });
243
- }
244
- }
245
- }
246
- else {
247
- eventWidth = slotRect.width;
248
- }
249
- return eventWidth;
250
- };
251
- }
252
- /**
253
- * @hidden
254
- */
255
- export class MonthResourceGroup {
256
- index;
257
- dayRanges = [];
258
- constructor(index) {
259
- this.index = index;
260
- }
261
- get hasSlots() {
262
- return Boolean(this.dayRanges.find(range => range && range.hasSlots));
263
- }
264
- registerSlot(slot) {
265
- const range = this.slotRange(slot);
266
- range.registerSlot(slot);
267
- }
268
- unregisterSlot(slot) {
269
- const range = this.dayRanges[slot.id.rangeIndex];
270
- range.unregisterSlot(slot);
271
- if (!range.hasSlots) {
272
- delete this.dayRanges[slot.id.rangeIndex];
273
- }
274
- }
275
- registerItem(component) {
276
- const range = this.dayRanges[component.rangeIndex];
277
- range.registerItem(component);
278
- }
279
- unregisterItem(component, id) {
280
- const range = this.dayRanges[id.rangeIndex];
281
- if (range) {
282
- range.unregisterItem(component, id.index);
283
- }
284
- }
285
- slotRange(slot) {
286
- const ranges = this.dayRanges;
287
- const rangeIndex = slot.id.rangeIndex;
288
- if (!ranges[rangeIndex]) {
289
- ranges[rangeIndex] = new SlotRange(rangeIndex);
290
- }
291
- return ranges[rangeIndex];
292
- }
293
- forEachRange(callback) {
294
- for (let i = 0; i < this.dayRanges.length; i++) {
295
- callback(this.dayRanges[i]);
296
- }
297
- }
298
- cleanRanges() {
299
- this.dayRanges = this.dayRanges.filter(r => Boolean(r));
300
- }
301
- }
302
- /**
303
- * @hidden
304
- */
305
- export class MonthSlotService extends BaseSlotService {
306
- layout(eventHeight, eventsPerDay, adaptiveSlotHeight) {
307
- this.groups.forEach((group) => group.forEachRange(range => range.layout(eventHeight, eventsPerDay, adaptiveSlotHeight)));
308
- }
309
- slotByIndex(slotIndex) {
310
- const [resourceIndex, rangeIndex, index] = slotIndex.split(':').map(part => parseInt(part, 10));
311
- return this.groups[resourceIndex].dayRanges[rangeIndex].slots[index];
312
- }
313
- forEachSlot(callback) {
314
- this.groups.forEach((group) => {
315
- group.dayRanges.forEach(range => {
316
- range.slots.forEach(slot => callback(slot));
317
- });
318
- });
319
- }
320
- forEachItem(callback) {
321
- this.groups.forEach((group) => {
322
- group.dayRanges.forEach(range => {
323
- range.items.forEach(viewItem => callback(viewItem));
324
- });
325
- });
326
- }
327
- createGroup(index) {
328
- return new MonthResourceGroup(index);
329
- }
330
- invalidate() {
331
- super.invalidate();
332
- this.forEachItem((viewItem) => {
333
- const data = viewItem.item.data;
334
- Object.keys(data).forEach(resourceIndex => {
335
- data[resourceIndex].hidden = false;
336
- });
337
- });
338
- }
339
- slotByPosition(x, y) {
340
- let range;
341
- for (let i = 0; i < this.groups.length; i++) {
342
- const group = this.groups[i];
343
- range = group.dayRanges.find(r => rectContains(r.rect, x, y, this.calculateScaleX()));
344
- if (range) {
345
- return range.slots.find(slot => rectContains(slot.rect, x, y, this.calculateScaleX()));
346
- }
347
- }
348
- }
349
- dragRanges(currentSlot, offset) {
350
- const start = new Date(currentSlot.start.getTime() - offset.start);
351
- const end = new Date(currentSlot.start.getTime() + offset.end);
352
- const group = this.groups[currentSlot.id.resourceIndex];
353
- const ranges = [];
354
- group.dayRanges.forEach(range => {
355
- const slots = range.slots.filter(s => intersects(start, end, s.start, s.end));
356
- if (slots.length) {
357
- ranges.push(slots);
358
- }
359
- });
360
- return {
361
- start,
362
- end,
363
- ranges
364
- };
365
- }
366
- groupSlotByPosition(currentSlot, x, y) {
367
- const range = this.groups[currentSlot.id.resourceIndex].dayRanges.find(r => rectContains(r.rect, x, y, this.calculateScaleX()));
368
- if (range) {
369
- return range.slots.find(slot => rectContains(slot.rect, x, y, this.calculateScaleX()));
370
- }
371
- }
372
- resizeRanges(currentSlot, task, resizeStart, offset) {
373
- const group = this.groups[task.resources[0].leafIdx];
374
- const ranges = [];
375
- const startDate = task.start.toUTCDate();
376
- const endDate = task.end.toUTCDate();
377
- let start, end;
378
- if (resizeStart) {
379
- start = currentSlot.start.getTime() + offset.start;
380
- if (start > endDate.getTime()) {
381
- start = new Date(Math.min(dateWithTime(endDate, startDate).getTime(), endDate.getTime()));
382
- }
383
- end = endDate;
384
- }
385
- else {
386
- start = startDate;
387
- end = currentSlot.start.getTime() + offset.end;
388
- if (end < start.getTime()) {
389
- end = new Date(Math.max(dateWithTime(startDate, endDate).getTime(), start.getTime()));
390
- }
391
- }
392
- group.dayRanges.forEach(range => {
393
- const slots = range.slots.filter(s => intersects(start, end, s.start, s.end));
394
- if (slots.length) {
395
- ranges.push(slots);
396
- }
397
- });
398
- return {
399
- start: new Date(start),
400
- end: new Date(end),
401
- ranges: ranges
402
- };
403
- }
404
- }