Skip to content

Commit c0be926

Browse files
author
Matt Lewis
committed
fix(dayView): respect eventSnapSize when resizing events
Fixes #188
1 parent 2be7fff commit c0be926

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

src/components/day/calendarDayView.component.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTi
3333
*/
3434
const SEGMENT_HEIGHT: number = 30;
3535

36+
/**
37+
* @hidden
38+
*/
39+
const MINUTES_IN_HOUR: number = 60;
40+
3641
/**
3742
* Shows all events on a given day. Example usage:
3843
*
@@ -325,18 +330,18 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
325330

326331
resizeEnded(dayEvent: DayViewEvent): void {
327332

328-
let segments: number;
333+
let pixelsMoved: number;
329334
if (this.currentResize.edge === 'top') {
330-
segments = (dayEvent.top - this.currentResize.originalTop) / this.eventSnapSize;
335+
pixelsMoved = (dayEvent.top - this.currentResize.originalTop);
331336
} else {
332-
segments = (dayEvent.height - this.currentResize.originalHeight) / this.eventSnapSize;
337+
pixelsMoved = (dayEvent.height - this.currentResize.originalHeight);
333338
}
334339

335340
dayEvent.top = this.currentResize.originalTop;
336341
dayEvent.height = this.currentResize.originalHeight;
337342

338-
const segmentAmountInMinutes: number = 60 / this.hourSegments;
339-
const minutesMoved: number = segments * segmentAmountInMinutes;
343+
const pixelAmountInMinutes: number = MINUTES_IN_HOUR / (this.hourSegments * SEGMENT_HEIGHT);
344+
const minutesMoved: number = pixelsMoved * pixelAmountInMinutes;
340345
let newStart: Date = dayEvent.event.start;
341346
let newEnd: Date = dayEvent.event.end;
342347
if (this.currentResize.edge === 'top') {
@@ -358,7 +363,7 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
358363

359364
eventDragged(dayEvent: DayViewEvent, draggedInPixels: number): void {
360365
const segments: number = draggedInPixels / this.eventSnapSize;
361-
const segmentAmountInMinutes: number = 60 / this.hourSegments;
366+
const segmentAmountInMinutes: number = MINUTES_IN_HOUR / this.hourSegments;
362367
const minutesMoved: number = segments * segmentAmountInMinutes;
363368
const newStart: Date = addMinutes(dayEvent.event.start, minutesMoved);
364369
let newEnd: Date;

test/calendarDayView.component.spec.ts

+38
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,44 @@ describe('CalendarDayViewComponent component', () => {
333333
});
334334
});
335335

336+
it('should resize the event and respect the event snap size', () => {
337+
const fixture: ComponentFixture<CalendarDayViewComponent> = TestBed.createComponent(CalendarDayViewComponent);
338+
fixture.componentInstance.viewDate = new Date('2016-06-27');
339+
fixture.componentInstance.events = [{
340+
title: 'foo',
341+
color: {primary: '', secondary: ''},
342+
start: moment('2016-06-27').add(4, 'hours').toDate(),
343+
end: moment('2016-06-27').add(6, 'hours').toDate(),
344+
resizable: {
345+
beforeStart: true
346+
}
347+
}];
348+
fixture.componentInstance.eventSnapSize = 1;
349+
fixture.componentInstance.ngOnChanges({viewDate: {}, events: {}});
350+
fixture.detectChanges();
351+
document.body.appendChild(fixture.nativeElement);
352+
const event: HTMLElement = fixture.nativeElement.querySelector('.cal-event-container');
353+
const rect: ClientRect = event.getBoundingClientRect();
354+
let resizeEvent: CalendarEventTimesChangedEvent;
355+
fixture.componentInstance.eventTimesChanged.subscribe(event => {
356+
resizeEvent = event;
357+
});
358+
triggerDomEvent('mousedown', document.body, {clientY: rect.top, clientX: rect.left + 10});
359+
fixture.detectChanges();
360+
triggerDomEvent('mousemove', document.body, {clientY: rect.top - 10, clientX: rect.left + 10});
361+
fixture.detectChanges();
362+
expect(event.getBoundingClientRect().top).to.equal(rect.top - 10);
363+
expect(event.getBoundingClientRect().height).to.equal(rect.height + 10);
364+
triggerDomEvent('mouseup', document.body, {clientY: rect.top - 10, clientX: rect.left + 10});
365+
fixture.detectChanges();
366+
fixture.destroy();
367+
expect(resizeEvent).to.deep.equal({
368+
event: fixture.componentInstance.events[0],
369+
newStart: moment('2016-06-27').add(4, 'hours').subtract(10, 'minutes').toDate(),
370+
newEnd: moment('2016-06-27').add(6, 'hours').toDate()
371+
});
372+
});
373+
336374
it('should show a tooltip on mouseover of the event', () => {
337375

338376
const fixture: ComponentFixture<CalendarDayViewComponent> = TestBed.createComponent(CalendarDayViewComponent);

0 commit comments

Comments
 (0)