@@ -21,6 +21,8 @@ import {
21
21
} from 'calendar-utils' ;
22
22
import { ResizeEvent } from 'angular-resizable-element' ;
23
23
import addDays from 'date-fns/add_days' ;
24
+ import differenceInDays from 'date-fns/difference_in_days' ;
25
+ import startOfDay from 'date-fns/start_of_day' ;
24
26
import { CalendarDragHelper } from '../../providers/calendarDragHelper.provider' ;
25
27
import { CalendarResizeHelper } from '../../providers/calendarResizeHelper.provider' ;
26
28
import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTimesChangedEvent.interface' ;
@@ -47,7 +49,7 @@ import { CalendarUtils } from '../../providers/calendarUtils.provider';
47
49
(dayClicked)="dayClicked.emit($event)"
48
50
(eventDropped)="eventTimesChanged.emit($event)">
49
51
</mwl-calendar-week-view-header>
50
- <div *ngFor="let eventRow of eventRows" #eventRowContainer>
52
+ <div *ngFor="let eventRow of eventRows" #eventRowContainer class="cal-events-row" >
51
53
<div
52
54
class="cal-event-container"
53
55
#event
@@ -63,11 +65,12 @@ import { CalendarUtils } from '../../providers/calendarUtils.provider';
63
65
(resizing)="resizing(weekEvent, $event, getDayColumnWidth(eventRowContainer))"
64
66
(resizeEnd)="resizeEnded(weekEvent)"
65
67
mwlDraggable
66
- [dragAxis]="{x: weekEvent.event.draggable && !currentResize, y: false}"
67
- [dragSnapGrid]="{x: getDayColumnWidth(eventRowContainer)}"
68
+ [dragSnapGrid]="{x: allowDragOutside ? 0 : getDayColumnWidth(eventRowContainer)}"
68
69
[validateDrag]="validateDrag"
69
70
(dragStart)="dragStart(weekViewContainer, event)"
70
- (dragEnd)="eventDragged(weekEvent, $event.x, getDayColumnWidth(eventRowContainer))">
71
+ [dragAxis]="{x: weekEvent.event.draggable && !currentResize, y: allowDragOutside}"
72
+ (dragEnd)="eventDragged(weekEvent, $event.x, getDayColumnWidth(eventRowContainer))"
73
+ [dropData]="{event: weekEvent.event}">
71
74
<mwl-calendar-week-view-event
72
75
[weekEvent]="weekEvent"
73
76
[tooltipPlacement]="tooltipPlacement"
@@ -132,6 +135,11 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
132
135
*/
133
136
@Input ( ) precision : 'days' | 'minutes' = 'days' ;
134
137
138
+ /**
139
+ * Allow events to be dragged outside of the calendar
140
+ */
141
+ @Input ( ) allowDragOutside : boolean = false ;
142
+
135
143
/**
136
144
* Called when a header week day is clicked
137
145
*/
@@ -285,8 +293,22 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
285
293
*/
286
294
eventDragged ( weekEvent : WeekViewEvent , draggedByPx : number , dayWidth : number ) : void {
287
295
288
- const daysDragged : number = draggedByPx / dayWidth ;
289
- const newStart : Date = addDays ( weekEvent . event . start , daysDragged ) ;
296
+ let daysDragged : number = Math . round ( draggedByPx / dayWidth ) ;
297
+ let newStart : Date = addDays ( weekEvent . event . start , daysDragged ) ;
298
+
299
+ if ( this . allowDragOutside ) {
300
+ // Restrict start to first and last day on current week
301
+ if ( newStart < this . days [ 0 ] . date ) {
302
+ daysDragged += differenceInDays ( startOfDay ( this . days [ 0 ] . date ) , startOfDay ( newStart ) ) ;
303
+ }
304
+ const lastDate : Date = this . days [ this . days . length - 1 ] . date ;
305
+ if ( newStart > lastDate ) {
306
+ daysDragged -= differenceInDays ( startOfDay ( newStart ) , startOfDay ( lastDate ) ) ;
307
+ }
308
+ }
309
+
310
+ newStart = addDays ( weekEvent . event . start , daysDragged ) ;
311
+
290
312
let newEnd : Date ;
291
313
if ( weekEvent . event . end ) {
292
314
newEnd = addDays ( weekEvent . event . end , daysDragged ) ;
@@ -307,9 +329,11 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
307
329
* @hidden
308
330
*/
309
331
dragStart ( weekViewContainer : HTMLElement , event : HTMLElement ) : void {
310
- const dragHelper : CalendarDragHelper = new CalendarDragHelper ( weekViewContainer , event ) ;
311
- this . validateDrag = ( { x, y} ) => ! this . currentResize && dragHelper . validateDrag ( { x, y} ) ;
312
- this . cdr . markForCheck ( ) ;
332
+ if ( ! this . allowDragOutside ) {
333
+ const dragHelper : CalendarDragHelper = new CalendarDragHelper ( weekViewContainer , event ) ;
334
+ this . validateDrag = ( { x, y} ) => ! this . currentResize && dragHelper . validateDrag ( { x, y} ) ;
335
+ this . cdr . markForCheck ( ) ;
336
+ }
313
337
}
314
338
315
339
private refreshHeader ( ) : void {
0 commit comments