@progress/kendo-angular-scheduler 2.2.0-dev.202111260859 → 3.0.1-dev.202202071010

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 (106) hide show
  1. package/dist/cdn/js/kendo-angular-scheduler.js +2 -2
  2. package/dist/cdn/main.js +1 -1
  3. package/dist/es/editing/date-time-picker.component.js +2 -1
  4. package/dist/es/editing/edit-dialog.component.js +1 -1
  5. package/dist/es/editing/recurrence/end-rule-radio-button.directive.js +5 -0
  6. package/dist/es/editing/recurrence/recurrence-monthly-yearly-editor.component.js +1 -1
  7. package/dist/es/editing/recurrence/repeat-on-radio-button.directive.js +5 -0
  8. package/dist/es/events/slot-drag-end-event.js +17 -0
  9. package/dist/es/events/slot-drag-event.js +18 -0
  10. package/dist/es/events/slot-drag-start-event.js +24 -0
  11. package/dist/es/events.js +3 -0
  12. package/dist/es/index.js +1 -0
  13. package/dist/es/package-metadata.js +1 -1
  14. package/dist/es/scheduler.component.js +73 -1
  15. package/dist/es/scheduler.module.js +5 -1
  16. package/dist/es/toolbar/view-selector.component.js +1 -1
  17. package/dist/es/types/slot-selection.js +23 -0
  18. package/dist/es/types.js +1 -0
  19. package/dist/es/views/common/base-view.js +103 -8
  20. package/dist/es/views/common/slot-selectable.directive.js +117 -0
  21. package/dist/es/views/common/view-footer.component.js +1 -1
  22. package/dist/es/views/common/views-shared.module.js +2 -1
  23. package/dist/es/views/day-time/day-time-view.component.js +1 -1
  24. package/dist/es/views/day-time/day-time.module.js +2 -1
  25. package/dist/es/views/month/month-view-renderer.component.js +9 -5
  26. package/dist/es/views/multi-day/multi-day-view-renderer.component.js +3 -3
  27. package/dist/es/views/timeline/timeline-multi-day-view.component.js +1 -1
  28. package/dist/es/views/utils.js +49 -0
  29. package/dist/es/views/view-state.service.js +18 -0
  30. package/dist/es2015/editing/date-time-picker.component.js +7 -1
  31. package/dist/es2015/editing/edit-dialog.component.js +7 -7
  32. package/dist/es2015/editing/recurrence/end-rule-radio-button.directive.d.ts +1 -0
  33. package/dist/es2015/editing/recurrence/end-rule-radio-button.directive.js +5 -0
  34. package/dist/es2015/editing/recurrence/recurrence-monthly-yearly-editor.component.js +14 -5
  35. package/dist/es2015/editing/recurrence/repeat-on-radio-button.directive.d.ts +1 -0
  36. package/dist/es2015/editing/recurrence/repeat-on-radio-button.directive.js +5 -0
  37. package/dist/es2015/events/slot-drag-end-event.d.ts +10 -0
  38. package/dist/es2015/events/slot-drag-end-event.js +10 -0
  39. package/dist/es2015/events/slot-drag-event.d.ts +39 -0
  40. package/dist/es2015/events/slot-drag-event.js +16 -0
  41. package/dist/es2015/events/slot-drag-start-event.d.ts +41 -0
  42. package/dist/es2015/events/slot-drag-start-event.js +19 -0
  43. package/dist/es2015/events.d.ts +3 -0
  44. package/dist/es2015/events.js +3 -0
  45. package/dist/es2015/index.d.ts +2 -0
  46. package/dist/es2015/index.js +1 -0
  47. package/dist/es2015/index.metadata.json +1 -1
  48. package/dist/es2015/package-metadata.js +1 -1
  49. package/dist/es2015/scheduler.component.d.ts +27 -0
  50. package/dist/es2015/scheduler.component.js +73 -1
  51. package/dist/es2015/scheduler.module.js +5 -1
  52. package/dist/es2015/toolbar/view-selector.component.js +1 -1
  53. package/dist/es2015/types/datepicker-options.interface.d.ts +5 -5
  54. package/dist/es2015/types/slot-selection.d.ts +71 -0
  55. package/dist/es2015/types/slot-selection.js +19 -0
  56. package/dist/es2015/types.d.ts +2 -0
  57. package/dist/es2015/types.js +1 -0
  58. package/dist/es2015/views/common/base-view.d.ts +26 -5
  59. package/dist/es2015/views/common/base-view.js +103 -8
  60. package/dist/es2015/views/common/slot-selectable.directive.d.ts +45 -0
  61. package/dist/es2015/views/common/slot-selectable.directive.js +112 -0
  62. package/dist/es2015/views/common/view-footer.component.js +1 -1
  63. package/dist/es2015/views/common/views-shared.module.js +2 -1
  64. package/dist/es2015/views/day-time/day-time-view.component.js +1 -1
  65. package/dist/es2015/views/day-time/day-time.module.js +2 -1
  66. package/dist/es2015/views/month/month-view-renderer.component.d.ts +3 -2
  67. package/dist/es2015/views/month/month-view-renderer.component.js +17 -7
  68. package/dist/es2015/views/multi-day/multi-day-view-renderer.component.d.ts +1 -1
  69. package/dist/es2015/views/multi-day/multi-day-view-renderer.component.js +22 -4
  70. package/dist/es2015/views/timeline/timeline-multi-day-view.component.js +8 -1
  71. package/dist/es2015/views/utils.d.ts +29 -0
  72. package/dist/es2015/views/utils.js +49 -0
  73. package/dist/es2015/views/view-state.service.d.ts +24 -1
  74. package/dist/es2015/views/view-state.service.js +18 -0
  75. package/dist/fesm2015/index.js +1674 -1231
  76. package/dist/fesm5/index.js +1803 -1388
  77. package/dist/npm/editing/date-time-picker.component.js +2 -1
  78. package/dist/npm/editing/edit-dialog.component.js +1 -1
  79. package/dist/npm/editing/recurrence/end-rule-radio-button.directive.js +5 -0
  80. package/dist/npm/editing/recurrence/recurrence-monthly-yearly-editor.component.js +1 -1
  81. package/dist/npm/editing/recurrence/repeat-on-radio-button.directive.js +5 -0
  82. package/dist/npm/events/slot-drag-end-event.js +19 -0
  83. package/dist/npm/events/slot-drag-event.js +20 -0
  84. package/dist/npm/events/slot-drag-start-event.js +26 -0
  85. package/dist/npm/events.js +6 -0
  86. package/dist/npm/index.js +2 -0
  87. package/dist/npm/package-metadata.js +1 -1
  88. package/dist/npm/scheduler.component.js +73 -1
  89. package/dist/npm/scheduler.module.js +4 -0
  90. package/dist/npm/toolbar/view-selector.component.js +1 -1
  91. package/dist/npm/types/slot-selection.js +25 -0
  92. package/dist/npm/types.js +2 -0
  93. package/dist/npm/views/common/base-view.js +102 -7
  94. package/dist/npm/views/common/slot-selectable.directive.js +119 -0
  95. package/dist/npm/views/common/view-footer.component.js +1 -1
  96. package/dist/npm/views/common/views-shared.module.js +2 -1
  97. package/dist/npm/views/day-time/day-time-view.component.js +1 -1
  98. package/dist/npm/views/day-time/day-time.module.js +2 -1
  99. package/dist/npm/views/month/month-view-renderer.component.js +8 -4
  100. package/dist/npm/views/multi-day/multi-day-view-renderer.component.js +3 -3
  101. package/dist/npm/views/timeline/timeline-multi-day-view.component.js +1 -1
  102. package/dist/npm/views/utils.js +53 -0
  103. package/dist/npm/views/view-state.service.js +18 -0
  104. package/dist/systemjs/kendo-angular-scheduler.js +1 -1
  105. package/package.json +27 -24
  106. package/schematics/ngAdd/index.js +1 -1
@@ -10,17 +10,19 @@ import { Subscription, BehaviorSubject, combineLatest, fromEvent, merge } from '
10
10
  import { switchMap, take, map, filter, tap } from 'rxjs/operators';
11
11
  import { closestInScope, hasClasses, preventLockedScroll, scrollbarWidth, wheelDeltaY, hasScrollbar } from '../../common/dom-queries';
12
12
  import { groupResources, getField, setField, fromClick, fromDoubleClick } from '../../common/util';
13
- import { assignTasksResources, toPx, elementOffset, pointDistance, ignoreContentChild, resourceItemByValue, convertNgClassBindings } from '../utils';
13
+ import { assignTasksResources, toPx, elementOffset, pointDistance, ignoreContentChild, resourceItemByValue, convertNgClassBindings, toUTCDateTime, dateWithTime, normaliseRangeStartAndEnd } from '../utils';
14
14
  import { BORDER_WIDTH } from '../constants';
15
15
  import Draggable from '@telerik/kendo-draggable';
16
16
  import { HintContainerComponent } from '../common/hint-container.component';
17
+ import { slotDragEventName } from '../../types/slot-selection';
18
+ import { SlotDragStartEvent } from '../../events/slot-drag-start-event';
17
19
  const SCROLL_CHANGE = 15;
18
20
  const MIN_DISTANCE = 60;
19
21
  const SCROLL_INTERVAL = 50;
20
22
  const MIN_MOVE_DISTANCE = 10;
21
23
  /** @hidden */
22
24
  export class BaseView {
23
- constructor(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization) {
25
+ constructor(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization, cdr) {
24
26
  this.viewContext = viewContext;
25
27
  this.viewState = viewState;
26
28
  this.intl = intl;
@@ -30,6 +32,7 @@ export class BaseView {
30
32
  this.element = element;
31
33
  this.pdfService = pdfService;
32
34
  this.localization = localization;
35
+ this.cdr = cdr;
33
36
  this.items = new BehaviorSubject(null);
34
37
  this.horizontalResources = [];
35
38
  this.verticalResources = [];
@@ -43,8 +46,17 @@ export class BaseView {
43
46
  this.spans = [];
44
47
  this.domEvents = [];
45
48
  this.resourcesCache = {};
49
+ /**
50
+ * The slot which is currently being dragged over while selecting a range of slots.
51
+ */
52
+ this.dragSelecting = null;
53
+ /**
54
+ * The slot where the drag-selecting originated. Used for flipping the start and end of the emitted range.
55
+ */
56
+ this.dragSelectOrigin = null;
46
57
  this.autoHeight = false;
47
58
  this.rtl = false;
59
+ this.isSlotSelected = () => false;
48
60
  this.setSlotClass = this.setSlotClass.bind(this);
49
61
  this.setHintClass = this.setHintClass.bind(this);
50
62
  this.weekStart = intl.firstDay();
@@ -161,6 +173,20 @@ export class BaseView {
161
173
  }
162
174
  return result;
163
175
  }
176
+ // Similar to https://tc39.es/proposal-temporal/docs/plaindate.html
177
+ // Stores a "plain date" in the UTC parts of a regular `Date`.
178
+ toPlainDate(date) {
179
+ const result = toUTCDateTime(this.convertDate(date));
180
+ return result;
181
+ }
182
+ // Similar to https://tc39.es/proposal-temporal/docs/plaindatetime.html
183
+ // Stores a "plain date-time" in the UTC parts of a regular `Date`.
184
+ toPlainDateTime(date, time) {
185
+ if (!date || !time) {
186
+ return null;
187
+ }
188
+ return this.toPlainDate(dateWithTime(date, time));
189
+ }
164
190
  optionsChange(options) {
165
191
  this.schedulerEventTemplate = options.eventTemplate;
166
192
  this.schedulerGroupHeaderTemplate = options.groupHeaderTemplate;
@@ -168,6 +194,8 @@ export class BaseView {
168
194
  this.max = options.max;
169
195
  this.editable = options.editable;
170
196
  this.timezone = options.timezone;
197
+ this.selectable = options.selectable;
198
+ this.isSlotSelected = options.isSlotSelected;
171
199
  if (!options.changes || anyChanged(['group', 'resources'], options.changes, false) ||
172
200
  options.group !== this.group || options.resources !== this.resources) {
173
201
  this.group = options.group;
@@ -194,6 +222,7 @@ export class BaseView {
194
222
  this.toggleElement(true);
195
223
  this.reflow();
196
224
  this.viewState.notifyLayoutEnd();
225
+ this.viewState.emitEvent(slotDragEventName.refreshSlotSelection);
197
226
  }
198
227
  assignResources() {
199
228
  assignTasksResources(this.tasks, {
@@ -234,16 +263,16 @@ export class BaseView {
234
263
  });
235
264
  }
236
265
  onPress(args) {
237
- const resizable = this.editable && this.editable.resize !== false;
238
- const draggable = this.editable && this.editable.drag !== false;
266
+ const editResizable = this.editable && this.editable.resize !== false;
267
+ const editDraggable = this.editable && this.editable.drag !== false;
239
268
  const target = args.originalEvent.target;
240
269
  if (hasClasses(target, 'k-resize-handle')) {
241
- if (!resizable) {
270
+ if (!editResizable) {
242
271
  return;
243
272
  }
244
273
  this.initResize(args);
245
274
  }
246
- else if (draggable) {
275
+ else if (editDraggable) {
247
276
  const task = this.targetTask(target);
248
277
  if (task) {
249
278
  if (!args.isTouch) {
@@ -253,6 +282,10 @@ export class BaseView {
253
282
  this.pressTarget = task;
254
283
  }
255
284
  }
285
+ const notDraggingEvent = !this.pressTarget;
286
+ if (notDraggingEvent && this.selectable) {
287
+ this.initDragSelect(args);
288
+ }
256
289
  this.dragArgs = args;
257
290
  }
258
291
  onDrag(args) {
@@ -267,12 +300,15 @@ export class BaseView {
267
300
  args.originalEvent.preventDefault();
268
301
  this.scrollContainer(this.drag, args);
269
302
  }
303
+ if (this.dragSelecting) {
304
+ this.dragSelect(args);
305
+ }
270
306
  }
271
307
  this.dragArgs = args;
272
308
  }
273
- onRelease() {
309
+ onRelease(args) {
274
310
  clearInterval(this.scrollInterval);
275
- const { resizing, dragging } = this;
311
+ const { resizing, dragging, dragSelecting } = this;
276
312
  if (resizing) {
277
313
  this.emitEvent('resizeEnd', {
278
314
  event: resizing.task.event,
@@ -299,6 +335,20 @@ export class BaseView {
299
335
  this.resizing = null;
300
336
  this.dragging = null;
301
337
  }
338
+ if (dragSelecting) {
339
+ const { start, end } = normaliseRangeStartAndEnd(this.dragSelectOrigin, this.dragSelecting);
340
+ const range = {
341
+ start: this.convertDate(start),
342
+ end: this.convertDate(end),
343
+ isAllDay: this.dragSelecting.isDaySlot,
344
+ resources: this.resourcesByIndex(this.dragSelecting.id.resourceIndex),
345
+ originalEvent: args.originalEvent
346
+ };
347
+ this.viewState.notifySlotSelectionEnd(range);
348
+ this.dragSelectOrigin = null;
349
+ this.dragSelecting = null;
350
+ this.cdr.markForCheck();
351
+ }
302
352
  this.container = null;
303
353
  this.dragArgs = null;
304
354
  this.pressLocation = null;
@@ -446,6 +496,51 @@ export class BaseView {
446
496
  this.updateHintContainer();
447
497
  }
448
498
  }
499
+ initDragSelect(args) {
500
+ this.updateDragContainer(args);
501
+ if (!this.containerOffset) {
502
+ return;
503
+ }
504
+ const { x, y } = this.coordinatesOffset(args.pageX, args.pageY);
505
+ const slot = this.slotByPosition(x, y, this.container);
506
+ if (!slot) {
507
+ return;
508
+ }
509
+ const range = {
510
+ start: this.convertDate(slot.start),
511
+ end: this.convertDate(slot.end),
512
+ isAllDay: slot.isDaySlot,
513
+ resources: this.resourcesByIndex(slot.id.resourceIndex),
514
+ originalEvent: args.originalEvent
515
+ };
516
+ const slotDragStartEvent = new SlotDragStartEvent(null, range);
517
+ this.viewState.notifySlotSelectionStart(slotDragStartEvent);
518
+ if (!slotDragStartEvent.isDefaultPrevented()) {
519
+ this.dragSelecting = slot;
520
+ this.dragSelectOrigin = slot;
521
+ this.cdr.markForCheck();
522
+ }
523
+ }
524
+ dragSelect(args) {
525
+ const { x, y } = this.coordinatesOffset(args.pageX, args.pageY);
526
+ const slot = this.slotByPosition(x, y, this.container);
527
+ if (!slot) {
528
+ return;
529
+ }
530
+ if (this.dragSelecting !== slot) {
531
+ this.dragSelecting = slot;
532
+ const { start, end } = normaliseRangeStartAndEnd(this.dragSelectOrigin, this.dragSelecting);
533
+ const range = {
534
+ start: this.convertDate(start),
535
+ end: this.convertDate(end),
536
+ isAllDay: slot.isDaySlot,
537
+ resources: this.resourcesByIndex(slot.id.resourceIndex),
538
+ originalEvent: args.originalEvent
539
+ };
540
+ this.viewState.notifySlotSelectionDrag(range);
541
+ this.cdr.markForCheck();
542
+ }
543
+ }
449
544
  dragHintClasses() {
450
545
  const hintClass = this.dragging.hintClass;
451
546
  let result = [];
@@ -0,0 +1,45 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { OnChanges, OnDestroy, OnInit, SimpleChanges, EventEmitter, ChangeDetectorRef } from '@angular/core';
6
+ import { SchedulerComponent } from '../../scheduler.component';
7
+ import { SlotRange } from '../../types/slot-selection';
8
+ /**
9
+ * A directive which manages the in-memory selection state of the Scheduler slots
10
+ * ([see example]({% slug slotselection_scheduler %}#toc-built-in-directive)).
11
+ */
12
+ export declare class SlotSelectableDirective implements OnInit, OnChanges, OnDestroy {
13
+ private scheduler;
14
+ private cdr;
15
+ /**
16
+ * The currently selected slot range.
17
+ */
18
+ slotSelection: SlotRange;
19
+ /**
20
+ * Fires when the currently selected slot range has changed through user interaction.
21
+ */
22
+ slotSelectionChange: EventEmitter<SlotRange>;
23
+ /**
24
+ * @hidden
25
+ * The resources of the cell where the selection started.
26
+ * When dragging over the slots of a different resource in grouped mode, the ongoing selection will not be affected.
27
+ */
28
+ private selectionOriginResources;
29
+ private selectedRange;
30
+ private slotSelectionChangeSource;
31
+ private subscriptions;
32
+ constructor(scheduler: SchedulerComponent, cdr: ChangeDetectorRef);
33
+ ngOnInit(): void;
34
+ ngOnChanges(changes: SimpleChanges): void;
35
+ ngOnDestroy(): void;
36
+ private isSlotSelected;
37
+ private initDragSelect;
38
+ private onDrag;
39
+ private onRelease;
40
+ /**
41
+ * @hidden
42
+ * Checks if the selected range contains a local date range.
43
+ */
44
+ private isInRange;
45
+ }
@@ -0,0 +1,112 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2021 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import * as tslib_1 from "tslib";
6
+ import { Directive, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
7
+ import { Subscription } from 'rxjs';
8
+ import { intersects, isSameRange, resourcesMatch } from '../utils';
9
+ import { SchedulerComponent } from '../../scheduler.component';
10
+ import { distinctUntilChanged, filter } from 'rxjs/operators';
11
+ import { isChanged } from '@progress/kendo-angular-common';
12
+ /**
13
+ * A directive which manages the in-memory selection state of the Scheduler slots
14
+ * ([see example]({% slug slotselection_scheduler %}#toc-built-in-directive)).
15
+ */
16
+ let SlotSelectableDirective = class SlotSelectableDirective {
17
+ constructor(scheduler, cdr) {
18
+ this.scheduler = scheduler;
19
+ this.cdr = cdr;
20
+ /**
21
+ * Fires when the currently selected slot range has changed through user interaction.
22
+ */
23
+ this.slotSelectionChange = new EventEmitter();
24
+ this.selectedRange = null;
25
+ this.slotSelectionChangeSource = new EventEmitter();
26
+ this.subscriptions = new Subscription();
27
+ this.scheduler.selectable = true;
28
+ this.subscriptions.add(this.slotSelectionChangeSource
29
+ .pipe(distinctUntilChanged(isSameRange)).subscribe((v) => {
30
+ this.slotSelectionChange.emit(v);
31
+ }));
32
+ const start$ = this.scheduler.slotDragStart;
33
+ const drag$ = this.scheduler.slotDrag;
34
+ const end$ = this.scheduler.slotDragEnd;
35
+ const startSource = start$.pipe(filter(e => !e.isDefaultPrevented()));
36
+ this.subscriptions.add(startSource.subscribe(e => this.initDragSelect(e)));
37
+ this.subscriptions.add(drag$.subscribe(e => this.onDrag(e)));
38
+ this.subscriptions.add(end$.subscribe(() => this.onRelease()));
39
+ }
40
+ ngOnInit() {
41
+ this.scheduler.isSlotSelected = this.isSlotSelected.bind(this);
42
+ }
43
+ ngOnChanges(changes) {
44
+ if (isChanged("slotSelection", changes, false)) {
45
+ /**
46
+ * The default values for resources below are necessarry because this is not fixed yet: https://github.com/telerik/kendo-angular-scheduler/pull/338
47
+ */
48
+ const resources = this.scheduler.resources ? [this.scheduler.resources[0].data[0]] : [undefined];
49
+ this.selectedRange = Object.assign({}, { isAllDay: false, resources }, changes.slotSelection.currentValue);
50
+ this.cdr.markForCheck();
51
+ }
52
+ }
53
+ ngOnDestroy() {
54
+ this.subscriptions.unsubscribe();
55
+ }
56
+ isSlotSelected({ start, end, isAllDay, resources }) {
57
+ if (!start || !end || !this.selectedRange) {
58
+ return false;
59
+ }
60
+ const match = resourcesMatch(this.selectedRange.resources, resources);
61
+ if (!match) {
62
+ return false; // Limit selection to the grouped resource where the drag started.
63
+ }
64
+ return this.selectedRange && isAllDay === this.selectedRange.isAllDay && this.isInRange(start, end);
65
+ }
66
+ initDragSelect({ start, end, isAllDay, resources }) {
67
+ this.selectionOriginResources = resources.slice();
68
+ this.selectedRange = { start, end, isAllDay, resources: resources.slice() };
69
+ this.cdr.markForCheck();
70
+ }
71
+ onDrag({ start, end, resources }) {
72
+ const match = resourcesMatch(this.selectionOriginResources, resources);
73
+ if (!match) {
74
+ return; // Don't change selection when dragging over a different grouped resource's cells.
75
+ }
76
+ this.selectedRange.start = start;
77
+ this.selectedRange.end = end;
78
+ this.cdr.markForCheck();
79
+ }
80
+ onRelease() {
81
+ this.selectionOriginResources = null;
82
+ if (this.selectedRange) {
83
+ this.slotSelectionChangeSource.emit(this.selectedRange);
84
+ }
85
+ }
86
+ /**
87
+ * @hidden
88
+ * Checks if the selected range contains a local date range.
89
+ */
90
+ isInRange(start, end) {
91
+ if (!this.selectedRange) {
92
+ return;
93
+ }
94
+ return intersects(start, end, this.selectedRange.start, this.selectedRange.end);
95
+ }
96
+ };
97
+ tslib_1.__decorate([
98
+ Input(),
99
+ tslib_1.__metadata("design:type", Object)
100
+ ], SlotSelectableDirective.prototype, "slotSelection", void 0);
101
+ tslib_1.__decorate([
102
+ Output(),
103
+ tslib_1.__metadata("design:type", EventEmitter)
104
+ ], SlotSelectableDirective.prototype, "slotSelectionChange", void 0);
105
+ SlotSelectableDirective = tslib_1.__decorate([
106
+ Directive({
107
+ selector: '[kendoSchedulerSlotSelectable]'
108
+ }),
109
+ tslib_1.__metadata("design:paramtypes", [SchedulerComponent,
110
+ ChangeDetectorRef])
111
+ ], SlotSelectableDirective);
112
+ export { SlotSelectableDirective };
@@ -47,7 +47,7 @@ ViewFooterComponent = tslib_1.__decorate([
47
47
  // tslint:disable-next-line:component-selector
48
48
  selector: '[viewFooter]',
49
49
  template: `
50
- <button type="button" class="k-button" *ngFor="let item of items" [ngClass]="item.cssClass" (click)="onItemClick($event, item)">
50
+ <button type="button" kendoButton *ngFor="let item of items" [ngClass]="item.cssClass" (click)="onItemClick($event, item)">
51
51
  <span class="k-button-icon k-icon" [ngClass]="item.iconClass"></span>
52
52
  <span class="k-button-text">{{ item.text }}</span>
53
53
  </button>
@@ -13,6 +13,7 @@ import { ResourceIteratorPipe } from './resource-iterator.pipe';
13
13
  import { HintContainerComponent } from './hint-container.component';
14
14
  import { ResizeHintComponent } from './resize-hint.component';
15
15
  import { SharedModule } from '../../shared.module';
16
+ import { ButtonsModule } from '@progress/kendo-angular-buttons';
16
17
  const DECLARATIONS = [
17
18
  ViewFooterComponent,
18
19
  WorkHoursFooterDirective,
@@ -28,7 +29,7 @@ let ViewsSharedModule = class ViewsSharedModule {
28
29
  };
29
30
  ViewsSharedModule = tslib_1.__decorate([
30
31
  NgModule({
31
- imports: [CommonModule, IntlModule, SharedModule],
32
+ imports: [CommonModule, IntlModule, SharedModule, ButtonsModule],
32
33
  exports: [
33
34
  DECLARATIONS,
34
35
  IntlModule,
@@ -24,7 +24,7 @@ const ɵ2 = getNextDate;
24
24
  */
25
25
  export class DayTimeViewComponent extends BaseView {
26
26
  constructor(changeDetector, viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization) {
27
- super(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization);
27
+ super(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization, changeDetector);
28
28
  this.changeDetector = changeDetector;
29
29
  this.numberOfDays = 1;
30
30
  this.startTime = '00:00';
@@ -8,6 +8,7 @@ import { CommonModule } from '@angular/common';
8
8
  import { SharedModule } from '../../shared.module';
9
9
  import { TimeSlotDirective, DaySlotDirective } from './event-slot.directive';
10
10
  import { DayTimeViewItemComponent } from './day-time-view-item.component';
11
+ import { ViewsSharedModule } from '../common/views-shared.module';
11
12
  const DIRECTIVES = [TimeSlotDirective, DaySlotDirective, DayTimeViewItemComponent];
12
13
  /**
13
14
  * @hidden
@@ -16,7 +17,7 @@ let DayTimeModule = class DayTimeModule {
16
17
  };
17
18
  DayTimeModule = tslib_1.__decorate([
18
19
  NgModule({
19
- imports: [CommonModule, SharedModule],
20
+ imports: [CommonModule, SharedModule, ViewsSharedModule],
20
21
  exports: [
21
22
  DIRECTIVES
22
23
  ],
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2021 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 { OnChanges, NgZone, ElementRef, Renderer2, TemplateRef } from '@angular/core';
5
+ import { OnChanges, NgZone, ElementRef, Renderer2, TemplateRef, ChangeDetectorRef } from '@angular/core';
6
6
  import { IntlService } from '@progress/kendo-angular-intl';
7
7
  import { DateRange, NavigationAction, ViewItem } from '../../types';
8
8
  import { ViewContextService } from '../view-context.service';
@@ -20,13 +20,14 @@ export declare class MonthViewRendererComponent extends BaseView implements OnCh
20
20
  weeks: any[];
21
21
  readonly monthDaySlotTemplateRef: TemplateRef<any>;
22
22
  private schedulerMonthDaySlotTemplate;
23
- constructor(viewContext: ViewContextService, viewState: ViewStateService, intl: IntlService, slotService: MonthSlotService, zone: NgZone, element: ElementRef, renderer: Renderer2, pdfService: PDFService, localization: LocalizationService);
23
+ constructor(viewContext: ViewContextService, viewState: ViewStateService, intl: IntlService, slotService: MonthSlotService, zone: NgZone, element: ElementRef, renderer: Renderer2, pdfService: PDFService, localization: LocalizationService, changeDetector: ChangeDetectorRef);
24
24
  ngOnChanges(changes: any): void;
25
25
  horizontalColspan(resourceIndex: number): any;
26
26
  verticalRowspan(resourceIndex: number): any;
27
27
  verticalItem(leafIndex: number, resourceIndex: number): any;
28
28
  daySlotClass(day: any, resourceIndex: any): string;
29
29
  cellTitle(value: Date): string;
30
+ addDay(dayStart: Date): Date;
30
31
  protected optionsChange(changes: any): void;
31
32
  protected createTasks(items: ViewItem[], dateRange: DateRange): any[];
32
33
  protected onTasksChange(): void;
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as tslib_1 from "tslib";
6
- import { Component, Input, NgZone, ElementRef, Renderer2, TemplateRef } from '@angular/core';
6
+ import { Component, Input, NgZone, ElementRef, Renderer2, TemplateRef, ChangeDetectorRef } from '@angular/core';
7
7
  import { IntlService } from '@progress/kendo-angular-intl';
8
8
  import { isChanged } from '@progress/kendo-angular-common';
9
9
  import { addDays, addMonths, firstDayInWeek, firstDayOfMonth, getDate, toLocalDate } from '@progress/kendo-date-math';
@@ -22,8 +22,8 @@ const WEEKS_COUNT = 6;
22
22
  * @hidden
23
23
  */
24
24
  let MonthViewRendererComponent = class MonthViewRendererComponent extends BaseView {
25
- constructor(viewContext, viewState, intl, slotService, zone, element, renderer, pdfService, localization) {
26
- super(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization);
25
+ constructor(viewContext, viewState, intl, slotService, zone, element, renderer, pdfService, localization, changeDetector) {
26
+ super(viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization, changeDetector);
27
27
  this.resizeHintFormat = { skeleton: 'Md' };
28
28
  this.weeks = [];
29
29
  }
@@ -74,6 +74,9 @@ let MonthViewRendererComponent = class MonthViewRendererComponent extends BaseVi
74
74
  cellTitle(value) {
75
75
  return this.intl.formatDate(value, 'D');
76
76
  }
77
+ addDay(dayStart) {
78
+ return addDays(dayStart, 1);
79
+ }
77
80
  optionsChange(changes) {
78
81
  this.schedulerMonthDaySlotTemplate = changes.monthDaySlotTemplate;
79
82
  super.optionsChange(changes);
@@ -238,7 +241,7 @@ MonthViewRendererComponent = tslib_1.__decorate([
238
241
  </table>
239
242
  </div>
240
243
  <div class="k-scheduler-content" #content>
241
- <table class="k-scheduler-table" #contentTable role="presentation">
244
+ <table class="k-scheduler-table k-user-select-none" #contentTable role="presentation">
242
245
  <ng-container *ngFor="let resourceItem of verticalResources | resourceIterator; let verticalIndex = index; trackBy: itemIndex">
243
246
  <tr *ngFor="let week of weeks; let rangeIndex = index; trackBy: itemIndex">
244
247
  <ng-container *ngFor="let resource of horizontalResources | resourceIterator; let horizontalIndex = index; trackBy: itemIndex">
@@ -248,8 +251,14 @@ MonthViewRendererComponent = tslib_1.__decorate([
248
251
  [start]="day"
249
252
  [id]="{ resourceIndex: verticalResources.length ? verticalIndex : horizontalIndex, rangeIndex: rangeIndex, index: index }"
250
253
  [title]="cellTitle(day)"
251
- >
252
- <span aria-hidden="true" class="k-link k-nav-day" *ngIf="!monthDaySlotTemplateRef" >{{ day | kendoDate: 'dd' }}</span>
254
+ [class.k-state-selected]="isSlotSelected({
255
+ start: toPlainDate(day),
256
+ end: addDay(toPlainDate(day)),
257
+ isAllDay: true,
258
+ resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex)
259
+ })"
260
+ >
261
+ <span aria-hidden="true" class="k-link k-nav-day" *ngIf="!monthDaySlotTemplateRef">{{ day | kendoDate: 'dd' }}</span>
253
262
  <ng-container *ngIf="monthDaySlotTemplateRef" [ngTemplateOutlet]="monthDaySlotTemplateRef"
254
263
  [ngTemplateOutletContext]="{ date: day, resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex) }"></ng-container>
255
264
  </td>
@@ -306,6 +315,7 @@ MonthViewRendererComponent = tslib_1.__decorate([
306
315
  ElementRef,
307
316
  Renderer2,
308
317
  PDFService,
309
- LocalizationService])
318
+ LocalizationService,
319
+ ChangeDetectorRef])
310
320
  ], MonthViewRendererComponent);
311
321
  export { MonthViewRendererComponent };
@@ -52,7 +52,7 @@ export declare class MultiDayViewRendererComponent extends DayTimeViewComponent
52
52
  protected reflow(): void;
53
53
  protected dragHorizontal(slot: any): boolean;
54
54
  protected updateHintContainer(): void;
55
- protected onRelease(): void;
55
+ protected onRelease(args: any): void;
56
56
  protected updateDragContainer(args: any): void;
57
57
  protected containerByPosition({ x, y }: any): any;
58
58
  protected readonly containers: any[];
@@ -145,8 +145,8 @@ let MultiDayViewRendererComponent = class MultiDayViewRendererComponent extends
145
145
  }
146
146
  super.updateHintContainer();
147
147
  }
148
- onRelease() {
149
- super.onRelease();
148
+ onRelease(args) {
149
+ super.onRelease(args);
150
150
  this.dragContainers = null;
151
151
  }
152
152
  updateDragContainer(args) {
@@ -307,7 +307,7 @@ MultiDayViewRendererComponent = tslib_1.__decorate([
307
307
  </tr>
308
308
  </table>
309
309
  <div style="position: relative;" *ngIf="!verticalResources.length">
310
- <table class="k-scheduler-table k-scheduler-header-all-day" aria-hidden="true">
310
+ <table class="k-scheduler-table k-scheduler-header-all-day k-user-select-none" aria-hidden="true">
311
311
  <tr>
312
312
  <ng-container *ngFor="let resource of horizontalResources | resourceIterator; let resourceIndex = index; trackBy: itemIndex;">
313
313
  <td *ngFor="let slot of daySlots; let index = index; trackBy: itemIndex"
@@ -315,6 +315,12 @@ MultiDayViewRendererComponent = tslib_1.__decorate([
315
315
  [start]="slot.start"
316
316
  [end]="slot.end"
317
317
  [id]="{ resourceIndex: resourceIndex, rangeIndex: 0, index: index }"
318
+ [class.k-state-selected]="isSlotSelected({
319
+ start: toPlainDate(slot.start),
320
+ end: toPlainDate(slot.end),
321
+ isAllDay: true,
322
+ resources: resourcesByIndex(resourceIndex)
323
+ })"
318
324
  [ngClass]="allDaySlotClass(slot, resourceIndex)">
319
325
  <ng-container *ngIf="allDaySlotTemplateRef" [ngTemplateOutlet]="allDaySlotTemplateRef"
320
326
  [ngTemplateOutletContext]="{ date: slot.start, resources: resourcesByIndex(resourceIndex) }"></ng-container>
@@ -396,7 +402,7 @@ MultiDayViewRendererComponent = tslib_1.__decorate([
396
402
  </ng-container>
397
403
  </table>
398
404
  </div>
399
- <div class="k-scheduler-content" #content>
405
+ <div class="k-scheduler-content k-user-select-none" #content>
400
406
  <ng-container *ngIf="showCurrentTime">
401
407
  <div *ngFor="let resource of verticalResources | resourceIterator; trackBy: itemIndex;"
402
408
  #currentTimeMarker class="k-current-time">
@@ -409,6 +415,12 @@ MultiDayViewRendererComponent = tslib_1.__decorate([
409
415
  daySlot
410
416
  [start]="slot.start"
411
417
  [end]="slot.end"
418
+ [class.k-state-selected]="isSlotSelected({
419
+ start: toPlainDate(slot.start),
420
+ end: toPlainDate(slot.end),
421
+ isAllDay: true,
422
+ resources: resourcesByIndex(verticalIndex)
423
+ })"
412
424
  [id]="{ resourceIndex: verticalIndex, rangeIndex: 0, index: index }">
413
425
  <ng-container *ngIf="allDaySlotTemplateRef" [ngTemplateOutlet]="allDaySlotTemplateRef"
414
426
  [ngTemplateOutletContext]="{ date: slot.start, resources: resourcesByIndex(verticalIndex) }"></ng-container>
@@ -427,6 +439,12 @@ MultiDayViewRendererComponent = tslib_1.__decorate([
427
439
  [workWeekStart]="workWeekStart"
428
440
  [workWeekEnd]="workWeekEnd"
429
441
  [id]="{ resourceIndex: verticalResources.length ? verticalIndex : horizontalIndex, rangeIndex: rangeIndex, index: index }"
442
+ [class.k-state-selected]="isSlotSelected({
443
+ start: toPlainDateTime(daySlot.start, slot.start),
444
+ end: toPlainDateTime(daySlot.start, slot.end),
445
+ isAllDay: false,
446
+ resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex)
447
+ })"
430
448
  >
431
449
  <ng-container *ngIf="timeSlotTemplateRef" [ngTemplateOutlet]="timeSlotTemplateRef"
432
450
  [ngTemplateOutletContext]="{ date: timeSlot.startLocalTime, resources: resourcesByIndex(timeSlot.id.resourceIndex) }">
@@ -214,7 +214,7 @@ TimelineMultiDayViewComponent = tslib_1.__decorate([
214
214
  class="k-current-time" #currentTimeMarker>
215
215
  </div>
216
216
  </ng-container>
217
- <table class="k-scheduler-table" #contentTable role="presentation">
217
+ <table class="k-scheduler-table k-user-select-none" #contentTable role="presentation">
218
218
  <colgroup>
219
219
  <col *ngFor="let slotIndex of slotsCount | repeat; trackBy: itemIndex;" [ngStyle]="{ 'width.px': columnWidth }" />
220
220
  </colgroup>
@@ -231,7 +231,14 @@ TimelineMultiDayViewComponent = tslib_1.__decorate([
231
231
  [workDayEnd]="workDayEndTime"
232
232
  [workWeekStart]="workWeekStart"
233
233
  [workWeekEnd]="workWeekEnd"
234
+ selectableSlot
234
235
  [id]="{ resourceIndex: verticalResources.length ? verticalIndex : horizontalIndex, rangeIndex: rangeIndex, index: index }"
236
+ [class.k-state-selected]="isSlotSelected({
237
+ start: toPlainDateTime(daySlot.start, slot.start),
238
+ end: toPlainDateTime(daySlot.start, slot.end),
239
+ isAllDay: false,
240
+ resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex)
241
+ })"
235
242
  >
236
243
  <ng-container *ngIf="timeSlotTemplateRef" [ngTemplateOutlet]="timeSlotTemplateRef"
237
244
  [ngTemplateOutletContext]="{ date: timeSlot.start, resources: resourcesByIndex(timeSlot.id.resourceIndex ) }">