Skip to content

Commit 19aa766

Browse files
author
Matt Lewis
committed
feat(dayView): add drag and drop support. #10
1 parent 38312e8 commit 19aa766

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

src/components/day/calendarDayViewEvent.component.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ import addMinutes from 'date-fns/add_minutes';
2525
[resizeSnapGrid]="{top: eventSnapSize, bottom: eventSnapSize}"
2626
(resizeStart)="resizeStarted(dayEvent, $event)"
2727
(resizing)="resizing(dayEvent, $event)"
28-
(resizeEnd)="resizeEnded(dayEvent)">
28+
(resizeEnd)="resizeEnded(dayEvent)"
29+
mwlDraggable
30+
[dragAxis]="{x: false, y: dayEvent.event.draggable}"
31+
[snapGrid]="{y: eventSnapSize}"
32+
(dragEnd)="eventDragged(dayEvent, $event.y)">
2933
<mwl-calendar-event-title
3034
[event]="dayEvent.event"
3135
view="day"
@@ -97,4 +101,16 @@ export class CalendarDayViewEventComponent {
97101

98102
}
99103

104+
eventDragged(dayEvent: DayViewEvent, draggedInPixels: number): void {
105+
const segments: number = draggedInPixels / this.eventSnapSize;
106+
const segmentAmountInMinutes: number = 60 / this.hourSegments;
107+
const minutesMoved: number = segments * segmentAmountInMinutes;
108+
const newStart: Date = addMinutes(dayEvent.event.start, minutesMoved);
109+
let newEnd: Date;
110+
if (dayEvent.event.end) {
111+
newEnd = addMinutes(dayEvent.event.end, minutesMoved);
112+
}
113+
this.eventResized.emit({newStart, newEnd, event: dayEvent.event});
114+
}
115+
100116
}

test/calendarDayView.component.spec.ts

+35
Original file line numberDiff line numberDiff line change
@@ -376,4 +376,39 @@ describe('CalendarDayViewComponent component', () => {
376376

377377
});
378378

379+
it('should allow events to be dragged and dropped', () => {
380+
const fixture: ComponentFixture<CalendarDayViewComponent> = TestBed.createComponent(CalendarDayViewComponent);
381+
fixture.componentInstance.viewDate = new Date('2016-06-27');
382+
fixture.componentInstance.events = [{
383+
title: 'foo',
384+
color: {primary: '', secondary: ''},
385+
start: moment('2016-06-27').add(4, 'hours').toDate(),
386+
end: moment('2016-06-27').add(6, 'hours').toDate(),
387+
draggable: true
388+
}];
389+
fixture.componentInstance.ngOnChanges({viewDate: {}, events: {}});
390+
fixture.detectChanges();
391+
document.body.appendChild(fixture.nativeElement);
392+
const event: HTMLElement = fixture.nativeElement.querySelector('.cal-event');
393+
const eventPosition: ClientRect = event.getBoundingClientRect();
394+
let dragEvent: CalendarEventTimesChangedEvent;
395+
fixture.componentInstance.eventTimesChanged.subscribe(event => {
396+
dragEvent = event;
397+
});
398+
triggerDomEvent('mousedown', event, {clientY: eventPosition.top + 5, clientX: eventPosition.left + 10});
399+
fixture.detectChanges();
400+
triggerDomEvent('mousemove', document.body, {clientY: eventPosition.top - 5, clientX: eventPosition.left + 10});
401+
fixture.detectChanges();
402+
expect(event.getBoundingClientRect().top).to.equal(eventPosition.top - 30);
403+
expect(event.getBoundingClientRect().bottom).to.equal(eventPosition.bottom - 30);
404+
triggerDomEvent('mouseup', document.body, {clientY: eventPosition.top - 30, clientX: eventPosition.left + 10});
405+
fixture.detectChanges();
406+
fixture.destroy();
407+
expect(dragEvent).to.deep.equal({
408+
event: fixture.componentInstance.events[0],
409+
newStart: moment('2016-06-27').add(4, 'hours').subtract(30, 'minutes').toDate(),
410+
newEnd: moment('2016-06-27').add(6, 'hours').subtract(30, 'minutes').toDate()
411+
});
412+
});
413+
379414
});

0 commit comments

Comments
 (0)