Skip to content

Commit 64a3dc4

Browse files
author
Matt Lewis
committed
feat(weekView): support drag and drop of events. #10
1 parent 7a2714b commit 64a3dc4

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/components/week/calendarWeekView.component.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ import { CalendarEventTimesChangedEvent } from './../../interfaces/calendarEvent
4949
[resizeSnapGrid]="{left: container.offsetWidth / 7, right: container.offsetWidth / 7}"
5050
(resizeStart)="resizeStarted(weekEvent, $event)"
5151
(resizing)="resizing(weekEvent, $event, container.offsetWidth / 7)"
52-
(resizeEnd)="resizeEnded(weekEvent)">
52+
(resizeEnd)="resizeEnded(weekEvent)"
53+
mwlDraggable
54+
[dragAxis]="{x: weekEvent.event.draggable, y: false}"
55+
[snapGrid]="{x: container.offsetWidth / 7}"
56+
(dragEnd)="eventDragged(weekEvent, $event.x, container.offsetWidth / 7)">
5357
<mwl-calendar-week-view-event
5458
[weekEvent]="weekEvent"
5559
[tooltipPlacement]="tooltipPlacement"
@@ -227,6 +231,22 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
227231

228232
}
229233

234+
/**
235+
* @private
236+
*/
237+
eventDragged(weekEvent: WeekViewEvent, draggedByPx: number, dayWidth: number): void {
238+
239+
const daysDragged: number = draggedByPx / dayWidth;
240+
const newStart: Date = addDays(weekEvent.event.start, daysDragged);
241+
let newEnd: Date;
242+
if (weekEvent.event.end) {
243+
newEnd = addDays(weekEvent.event.end, daysDragged);
244+
}
245+
246+
this.eventTimesChanged.emit({newStart, newEnd, event: weekEvent.event});
247+
248+
}
249+
230250
private refreshHeader(): void {
231251
this.days = getWeekViewHeader({
232252
viewDate: this.viewDate,

test/calendarWeekView.component.spec.ts

+35
Original file line numberDiff line numberDiff line change
@@ -294,4 +294,39 @@ describe('calendarWeekView component', () => {
294294
});
295295
});
296296

297+
it('should allow the event to be dragged and dropped', () => {
298+
const fixture: ComponentFixture<CalendarWeekViewComponent> = TestBed.createComponent(CalendarWeekViewComponent);
299+
fixture.componentInstance.viewDate = new Date('2016-12-08');
300+
fixture.componentInstance.events = [{
301+
title: 'foo',
302+
color: {primary: '', secondary: ''},
303+
start: moment('2016-12-08').add(4, 'hours').toDate(),
304+
end: moment('2016-12-08').add(6, 'hours').toDate(),
305+
draggable: true
306+
}];
307+
fixture.componentInstance.ngOnChanges({viewDate: {}, events: {}});
308+
fixture.detectChanges();
309+
document.body.appendChild(fixture.nativeElement);
310+
const event: HTMLElement = fixture.nativeElement.querySelector('.cal-event-container');
311+
const dayWidth: number = event.parentElement.offsetWidth / 7;
312+
const eventPosition: ClientRect = event.getBoundingClientRect();
313+
let dragEvent: CalendarEventTimesChangedEvent;
314+
fixture.componentInstance.eventTimesChanged.subscribe(event => {
315+
dragEvent = event;
316+
});
317+
triggerDomEvent('mousedown', event, {clientX: eventPosition.left, clientY: eventPosition.top});
318+
fixture.detectChanges();
319+
triggerDomEvent('mousemove', document.body, {clientX: eventPosition.left - 50, clientY: eventPosition.top});
320+
fixture.detectChanges();
321+
expect(Math.round(event.getBoundingClientRect().left)).to.equal(Math.round(eventPosition.left - dayWidth));
322+
triggerDomEvent('mouseup', document.body, {clientX: eventPosition.left - dayWidth, clientY: eventPosition.top});
323+
fixture.detectChanges();
324+
fixture.destroy();
325+
expect(dragEvent).to.deep.equal({
326+
event: fixture.componentInstance.events[0],
327+
newStart: moment('2016-12-07').add(4, 'hours').toDate(),
328+
newEnd: moment('2016-12-07').add(6, 'hours').toDate()
329+
});
330+
});
331+
297332
});

0 commit comments

Comments
 (0)