@@ -25,8 +25,9 @@ import { CalendarDragHelper } from '../common/calendar-drag-helper.provider';
25
25
import { CalendarResizeHelper } from '../common/calendar-resize-helper.provider' ;
26
26
import { CalendarEventTimesChangedEvent } from '../common/calendar-event-times-changed-event.interface' ;
27
27
import { CalendarUtils } from '../common/calendar-utils.provider' ;
28
- import { validateEvents , trackByEventId } from '../common/util' ;
28
+ import { validateEvents , trackByEventId , roundToNearest } from '../common/util' ;
29
29
import { DateAdapter } from '../../date-adapters/date-adapter' ;
30
+ import { DragEnd } from 'angular-draggable-droppable/draggable.directive' ;
30
31
31
32
export interface CalendarDayViewBeforeRenderEvent {
32
33
body : {
@@ -64,15 +65,19 @@ export interface DayViewEventResize {
64
65
@Component ( {
65
66
selector : 'mwl-calendar-day-view' ,
66
67
template : `
67
- <div class="cal-day-view" #dayViewContainer >
68
+ <div class="cal-day-view">
68
69
<mwl-calendar-all-day-event
69
70
*ngFor="let event of view.allDayEvents; trackBy:trackByEventId"
70
71
[event]="event"
71
72
[customTemplate]="allDayEventTemplate"
72
73
[eventTitleTemplate]="eventTitleTemplate"
73
74
(eventClicked)="eventClicked.emit({event: event})">
74
75
</mwl-calendar-all-day-event>
75
- <div class="cal-hour-rows">
76
+ <div
77
+ class="cal-hour-rows"
78
+ #dayEventsContainer
79
+ mwlDroppable
80
+ (drop)="eventDroppedWithinContainer = true">
76
81
<div class="cal-events">
77
82
<div
78
83
#event
@@ -86,15 +91,16 @@ export interface DayViewEventResize {
86
91
[resizeEdges]="{top: dayEvent.event?.resizable?.beforeStart, bottom: dayEvent.event?.resizable?.afterEnd}"
87
92
[resizeSnapGrid]="{top: eventSnapSize, bottom: eventSnapSize}"
88
93
[validateResize]="validateResize"
89
- (resizeStart)="resizeStarted(dayEvent, $event, dayViewContainer )"
94
+ (resizeStart)="resizeStarted(dayEvent, $event, dayEventsContainer )"
90
95
(resizing)="resizing(dayEvent, $event)"
91
96
(resizeEnd)="resizeEnded(dayEvent)"
92
97
mwlDraggable
93
- [dragAxis]="{x: false, y: dayEvent.event.draggable && currentResizes.size === 0}"
94
- [dragSnapGrid]="{y: eventSnapSize}"
95
- [validateDrag]="validateDrag"
96
- (dragPointerDown)="dragStart(event, dayViewContainer)"
97
- (dragEnd)="eventDragged(dayEvent, $event.y)"
98
+ [dropData]="{event: dayEvent.event, isInternal: true}"
99
+ [dragAxis]="{x: !snapDraggedEvents && dayEvent.event.draggable && currentResizes.size === 0, y: dayEvent.event.draggable && currentResizes.size === 0}"
100
+ [dragSnapGrid]="snapDraggedEvents ? {y: eventSnapSize} : {}"
101
+ [validateDrag]="snapDraggedEvents ? validateDrag : false"
102
+ (dragPointerDown)="dragStarted(event, dayEventsContainer)"
103
+ (dragEnd)="dragEnded(dayEvent, $event)"
98
104
[style.marginTop.px]="dayEvent.top"
99
105
[style.height.px]="dayEvent.height"
100
106
[style.marginLeft.px]="dayEvent.left + 70"
@@ -226,6 +232,11 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
226
232
*/
227
233
@Input ( ) eventTitleTemplate : TemplateRef < any > ;
228
234
235
+ /**
236
+ * Whether to snap events to a grid when dragging
237
+ */
238
+ @Input ( ) snapDraggedEvents : boolean = true ;
239
+
229
240
/**
230
241
* Called when an event title is clicked
231
242
*/
@@ -280,6 +291,11 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
280
291
*/
281
292
currentResizes : Map < DayViewEvent , DayViewEventResize > = new Map ( ) ;
282
293
294
+ /**
295
+ * @hidden
296
+ */
297
+ eventDroppedWithinContainer = false ;
298
+
283
299
/**
284
300
* @hidden
285
301
*/
@@ -379,10 +395,14 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
379
395
}
380
396
381
397
eventDropped (
382
- dropEvent : { dropData ?: { event ?: CalendarEvent } } ,
398
+ dropEvent : { dropData ?: { event ?: CalendarEvent ; isInternal ?: boolean } } ,
383
399
segment : DayViewHourSegment
384
400
) : void {
385
- if ( dropEvent . dropData && dropEvent . dropData . event ) {
401
+ if (
402
+ dropEvent . dropData &&
403
+ dropEvent . dropData . event &&
404
+ ! dropEvent . dropData . isInternal
405
+ ) {
386
406
this . eventTimesChanged . emit ( {
387
407
event : dropEvent . dropData . event ,
388
408
newStart : segment . date
@@ -393,15 +413,15 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
393
413
resizeStarted (
394
414
event : DayViewEvent ,
395
415
resizeEvent : ResizeEvent ,
396
- dayViewContainer : HTMLElement
416
+ dayEventsContainer : HTMLElement
397
417
) : void {
398
418
this . currentResizes . set ( event , {
399
419
originalTop : event . top ,
400
420
originalHeight : event . height ,
401
421
edge : typeof resizeEvent . edges . top !== 'undefined' ? 'top' : 'bottom'
402
422
} ) ;
403
423
const resizeHelper : CalendarResizeHelper = new CalendarResizeHelper (
404
- dayViewContainer
424
+ dayEventsContainer
405
425
) ;
406
426
this . validateResize = ( { rectangle } ) =>
407
427
resizeHelper . validateResize ( { rectangle } ) ;
@@ -446,29 +466,37 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
446
466
this . currentResizes . delete ( dayEvent ) ;
447
467
}
448
468
449
- dragStart ( event : HTMLElement , dayViewContainer : HTMLElement ) : void {
469
+ dragStarted ( event : HTMLElement , dayEventsContainer : HTMLElement ) : void {
450
470
const dragHelper : CalendarDragHelper = new CalendarDragHelper (
451
- dayViewContainer ,
471
+ dayEventsContainer ,
452
472
event
453
473
) ;
454
474
this . validateDrag = ( { x, y } ) =>
455
475
this . currentResizes . size === 0 && dragHelper . validateDrag ( { x, y } ) ;
476
+ this . eventDroppedWithinContainer = false ;
456
477
this . cdr . markForCheck ( ) ;
457
478
}
458
479
459
- eventDragged ( dayEvent : DayViewEvent , draggedInPixels : number ) : void {
460
- const pixelAmountInMinutes : number =
461
- MINUTES_IN_HOUR / ( this . hourSegments * this . hourSegmentHeight ) ;
462
- const minutesMoved : number = draggedInPixels * pixelAmountInMinutes ;
463
- const newStart : Date = this . dateAdapter . addMinutes (
464
- dayEvent . event . start ,
465
- minutesMoved
466
- ) ;
467
- let newEnd : Date ;
468
- if ( dayEvent . event . end ) {
469
- newEnd = this . dateAdapter . addMinutes ( dayEvent . event . end , minutesMoved ) ;
480
+ dragEnded ( dayEvent : DayViewEvent , dragEndEvent : DragEnd ) : void {
481
+ if ( this . eventDroppedWithinContainer ) {
482
+ const draggedInPixelsSnapSize = roundToNearest (
483
+ dragEndEvent . y ,
484
+ this . eventSnapSize
485
+ ) ;
486
+ const pixelAmountInMinutes : number =
487
+ MINUTES_IN_HOUR / ( this . hourSegments * this . hourSegmentHeight ) ;
488
+ const minutesMoved : number =
489
+ draggedInPixelsSnapSize * pixelAmountInMinutes ;
490
+ const newStart : Date = this . dateAdapter . addMinutes (
491
+ dayEvent . event . start ,
492
+ minutesMoved
493
+ ) ;
494
+ let newEnd : Date ;
495
+ if ( dayEvent . event . end ) {
496
+ newEnd = this . dateAdapter . addMinutes ( dayEvent . event . end , minutesMoved ) ;
497
+ }
498
+ this . eventTimesChanged . emit ( { newStart, newEnd, event : dayEvent . event } ) ;
470
499
}
471
- this . eventTimesChanged . emit ( { newStart, newEnd, event : dayEvent . event } ) ;
472
500
}
473
501
474
502
private refreshHourGrid ( ) : void {
0 commit comments