Skip to content

Commit 83266f7

Browse files
author
Matt Lewis
committed
fix(weekView): allow external events to be dropped on the column headers
Closes #150
1 parent 86e5d06 commit 83266f7

5 files changed

+89
-36
lines changed

scss/week-view.scss

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
border-right: 1px solid #e1e1e1;
1818
}
1919

20-
.cal-day-headers .cal-header:hover {
20+
.cal-day-headers .cal-header:hover,
21+
.cal-day-headers .cal-drag-over {
2122
background-color: #ededed;
2223
}
2324

src/components/week/calendarWeekView.component.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTi
4545
*ngFor="let day of days"
4646
[day]="day"
4747
[locale]="locale"
48-
(click)="dayClicked.emit({date: day.date})">
48+
(click)="dayClicked.emit({date: day.date})"
49+
[class.cal-drag-over]="day.dragOver"
50+
mwlDroppable
51+
(dragEnter)="day.dragOver = true"
52+
(dragLeave)="day.dragOver = false"
53+
(drop)="day.dragOver = false; eventTimesChanged.emit({event: $event.dropData.event, newStart: day.date})">
4954
</mwl-calendar-week-view-header>
5055
</div>
5156
<div *ngFor="let eventRow of eventRows" #eventRowContainer>

test/calendarDayView.component.spec.ts

+2-27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Component } from '@angular/core';
21
import {
32
inject,
43
ComponentFixture,
@@ -21,34 +20,10 @@ import {
2120
import { CalendarDayViewComponent } from './../src/components/day/calendarDayView.component';
2221
import { Subject } from 'rxjs/Rx';
2322
import { spy } from 'sinon';
24-
import { triggerDomEvent } from './util';
23+
import { triggerDomEvent, ExternalEventComponent } from './util';
2524

2625
describe('CalendarDayViewComponent component', () => {
2726

28-
@Component({
29-
template: '<div class="external-event" mwlDraggable [dropData]="{event: event}">{{ event.title }}</div>',
30-
styles: [`
31-
.external-event {
32-
position: fixed;
33-
top: 0;
34-
left: 0;
35-
width: 10px;
36-
height: 10px;
37-
}
38-
`]
39-
})
40-
class ExternalEventComponent {
41-
event: CalendarEvent = {
42-
title: 'foo',
43-
start: new Date(),
44-
draggable: true,
45-
color: {
46-
primary: 'blue',
47-
secondary: 'lightblue'
48-
}
49-
};
50-
}
51-
5227
beforeEach(() => {
5328
TestBed.configureTestingModule({
5429
imports: [
@@ -540,7 +515,7 @@ describe('CalendarDayViewComponent component', () => {
540515
triggerDomEvent('mousemove', document.body, {clientY: segmentPosition.top, clientX: segmentPosition.left});
541516
fixture.detectChanges();
542517
expect(segment.classList.contains('cal-drag-over')).to.be.true;
543-
triggerDomEvent('mouseup', document.body, {clientY: segmentPosition.top, clientX: eventPosition.left});
518+
triggerDomEvent('mouseup', document.body, {clientY: segmentPosition.top, clientX: segmentPosition.left});
544519
fixture.detectChanges();
545520
fixture.destroy();
546521
externalEventFixture.destroy();

test/calendarWeekView.component.spec.ts

+51-6
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,25 @@ import {
1313
CalendarModule,
1414
MOMENT,
1515
CalendarEventTimesChangedEvent
16-
} from './../src';
17-
import { CalendarWeekViewComponent } from './../src/components/week/calendarWeekView.component';
18-
import { DraggableHelper } from 'angular-draggable-droppable';
19-
import { Subject } from 'rxjs/Rx';
20-
import { triggerDomEvent } from './util';
16+
} from '../src';
17+
import { CalendarWeekViewComponent } from '../src/components/week/calendarWeekView.component';
18+
import { DraggableHelper, DragAndDropModule } from 'angular-draggable-droppable';
19+
import { Subject } from 'rxjs/Subject';
20+
import * as sinon from 'sinon';
21+
import { triggerDomEvent, ExternalEventComponent } from './util';
2122

2223
describe('calendarWeekView component', () => {
2324

2425
beforeEach(() => {
25-
TestBed.configureTestingModule({imports: [CalendarModule]});
26+
TestBed.configureTestingModule({
27+
imports: [
28+
CalendarModule,
29+
DragAndDropModule
30+
],
31+
declarations: [
32+
ExternalEventComponent
33+
]
34+
});
2635
TestBed.configureCompiler({
2736
providers: [
2837
CalendarEventTitleFormatter,
@@ -393,4 +402,40 @@ describe('calendarWeekView component', () => {
393402
fixture.destroy();
394403
});
395404

405+
it('should allow external events to be dropped on the week view headers', () => {
406+
const fixture: ComponentFixture<CalendarWeekViewComponent> = TestBed.createComponent(CalendarWeekViewComponent);
407+
fixture.componentInstance.viewDate = new Date('2016-06-27');
408+
fixture.componentInstance.events = [];
409+
fixture.componentInstance.ngOnChanges({viewDate: {}, events: {}});
410+
fixture.detectChanges();
411+
document.body.appendChild(fixture.nativeElement);
412+
413+
const externalEventFixture: ComponentFixture<ExternalEventComponent> = TestBed.createComponent(ExternalEventComponent);
414+
externalEventFixture.detectChanges();
415+
document.body.appendChild(externalEventFixture.nativeElement);
416+
417+
const event: HTMLElement = externalEventFixture.nativeElement.querySelector('.external-event');
418+
const eventPosition: ClientRect = event.getBoundingClientRect();
419+
420+
const headers: any[] = Array.from(fixture.nativeElement.querySelectorAll('mwl-calendar-week-view-header'));
421+
const header: HTMLElement = headers[2];
422+
const headerPosition: ClientRect = header.getBoundingClientRect();
423+
424+
const eventDropped: sinon.SinonSpy = sinon.spy();
425+
fixture.componentInstance.eventTimesChanged.subscribe(eventDropped);
426+
triggerDomEvent('mousedown', event, {clientY: eventPosition.top, clientX: eventPosition.left});
427+
fixture.detectChanges();
428+
triggerDomEvent('mousemove', document.body, {clientY: headerPosition.top, clientX: headerPosition.left});
429+
fixture.detectChanges();
430+
expect(header.classList.contains('cal-drag-over')).to.be.true;
431+
triggerDomEvent('mouseup', document.body, {clientY: headerPosition.top, clientX: headerPosition.left});
432+
fixture.detectChanges();
433+
fixture.destroy();
434+
externalEventFixture.destroy();
435+
expect(eventDropped).to.have.been.calledWith({
436+
event: externalEventFixture.componentInstance.event,
437+
newStart: moment('2016-06-27').startOf('week').add(2, 'days').toDate()
438+
});
439+
});
440+
396441
});

test/util.ts

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
1+
import { Component } from '@angular/core';
2+
import { CalendarEvent } from './../src';
3+
14
export const triggerDomEvent: Function = (eventType: string, target: HTMLElement | Element, eventData: Object = {}) => {
25
const event: Event = document.createEvent('Event');
36
Object.assign(event, eventData);
47
event.initEvent(eventType, true, true);
58
target.dispatchEvent(event);
6-
};
9+
};
10+
11+
@Component({
12+
template: '<div class="external-event" mwlDraggable [dropData]="{event: event}">{{ event.title }}</div>',
13+
styles: [`
14+
.external-event {
15+
position: fixed;
16+
top: 0;
17+
left: 0;
18+
width: 10px;
19+
height: 10px;
20+
}
21+
`]
22+
})
23+
export class ExternalEventComponent {
24+
event: CalendarEvent = {
25+
title: 'foo',
26+
start: new Date(),
27+
draggable: true,
28+
color: {
29+
primary: 'blue',
30+
secondary: 'lightblue'
31+
}
32+
};
33+
}

0 commit comments

Comments
 (0)