1
- import { Component , Input , Output , EventEmitter } from '@angular/core' ;
1
+ import { Component , Input , Output , EventEmitter , ChangeDetectorRef } from '@angular/core' ;
2
2
import { DayViewEvent } from 'calendar-utils' ;
3
3
import { ResizeEvent } from 'angular-resizable-element' ;
4
4
import addMinutes from 'date-fns/add_minutes' ;
5
+ import { CalendarDragHelper } from '../../providers/calendarDragHelper.provider' ;
5
6
6
7
@Component ( {
7
8
selector : 'mwl-calendar-day-view-event' ,
8
9
template : `
9
10
<div
10
11
class="cal-event"
12
+ #event
11
13
[style.marginTop.px]="dayEvent.top"
12
14
[style.marginLeft.px]="dayEvent.left + 70"
13
15
[style.height.px]="dayEvent.height"
@@ -16,6 +18,7 @@ import addMinutes from 'date-fns/add_minutes';
16
18
[style.borderColor]="dayEvent.event.color.primary"
17
19
[class.cal-starts-within-day]="!dayEvent.startsBeforeDay"
18
20
[class.cal-ends-within-day]="!dayEvent.endsAfterDay"
21
+ [class.cal-draggable]="dayEvent.event.draggable"
19
22
[ngClass]="dayEvent.event.cssClass"
20
23
[mwlCalendarTooltip]="dayEvent.event | calendarEventTitle:'dayTooltip'"
21
24
[tooltipPlacement]="tooltipPlacement"
@@ -24,7 +27,13 @@ import addMinutes from 'date-fns/add_minutes';
24
27
[resizeSnapGrid]="{top: eventSnapSize, bottom: eventSnapSize}"
25
28
(resizeStart)="resizeStarted(dayEvent, $event)"
26
29
(resizing)="resizing(dayEvent, $event)"
27
- (resizeEnd)="resizeEnded(dayEvent)">
30
+ (resizeEnd)="resizeEnded(dayEvent)"
31
+ mwlDraggable
32
+ [dragAxis]="{x: false, y: dayEvent.event.draggable && !currentResize}"
33
+ [dragSnapGrid]="{y: eventSnapSize}"
34
+ [validateDrag]="validateDrag"
35
+ (dragStart)="dragStart(event)"
36
+ (dragEnd)="eventDragged(dayEvent, $event.y)">
28
37
<mwl-calendar-event-title
29
38
[event]="dayEvent.event"
30
39
view="day"
@@ -44,6 +53,8 @@ export class CalendarDayViewEventComponent {
44
53
45
54
@Input ( ) tooltipPlacement : string ;
46
55
56
+ @Input ( ) dayViewContainer : HTMLElement ;
57
+
47
58
@Output ( ) eventClicked : EventEmitter < any > = new EventEmitter ( ) ;
48
59
49
60
@Output ( ) eventResized : EventEmitter < any > = new EventEmitter ( ) ;
@@ -54,6 +65,10 @@ export class CalendarDayViewEventComponent {
54
65
edge : string
55
66
} ;
56
67
68
+ validateDrag : Function ;
69
+
70
+ constructor ( private cdr : ChangeDetectorRef ) { }
71
+
57
72
resizeStarted ( event : DayViewEvent , resizeEvent : ResizeEvent ) : void {
58
73
this . currentResize = {
59
74
originalTop : event . top ,
@@ -93,7 +108,26 @@ export class CalendarDayViewEventComponent {
93
108
}
94
109
95
110
this . eventResized . emit ( { newStart, newEnd, event : dayEvent . event } ) ;
111
+ this . currentResize = null ;
96
112
97
113
}
98
114
115
+ dragStart ( event : HTMLElement ) : void {
116
+ const dragHelper : CalendarDragHelper = new CalendarDragHelper ( this . dayViewContainer , event ) ;
117
+ this . validateDrag = ( { x, y} ) => dragHelper . validateDrag ( { x, y} ) ;
118
+ this . cdr . markForCheck ( ) ;
119
+ }
120
+
121
+ eventDragged ( dayEvent : DayViewEvent , draggedInPixels : number ) : void {
122
+ const segments : number = draggedInPixels / this . eventSnapSize ;
123
+ const segmentAmountInMinutes : number = 60 / this . hourSegments ;
124
+ const minutesMoved : number = segments * segmentAmountInMinutes ;
125
+ const newStart : Date = addMinutes ( dayEvent . event . start , minutesMoved ) ;
126
+ let newEnd : Date ;
127
+ if ( dayEvent . event . end ) {
128
+ newEnd = addMinutes ( dayEvent . event . end , minutesMoved ) ;
129
+ }
130
+ this . eventResized . emit ( { newStart, newEnd, event : dayEvent . event } ) ;
131
+ }
132
+
99
133
}
0 commit comments