Skip to content

Commit df339b9

Browse files
committed
fix: allow events that end on different days to be dragged
1 parent 3147854 commit df339b9

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

src/modules/common/util.ts

+13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
DayViewHour,
55
DayViewHourSegment,
66
validateEvents as validateEventsWithoutLog,
7+
ViewPeriod,
78
WeekDay,
89
WeekViewAllDayEvent
910
} from 'calendar-utils';
@@ -108,3 +109,15 @@ export function addDaysWithExclusions(
108109
}
109110
return result;
110111
}
112+
113+
export function isDraggedWithinPeriod(
114+
newStart: Date,
115+
newEnd: Date,
116+
period: ViewPeriod
117+
): boolean {
118+
const end = newEnd || newStart;
119+
return (
120+
(period.start <= newStart && newStart <= period.end) ||
121+
(period.start <= end && end <= period.end)
122+
);
123+
}

src/modules/day/calendar-day-view.component.ts

+12-7
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ import {
3737
getMinutesMoved,
3838
getDefaultEventEnd,
3939
getMinimumEventHeightInMinutes,
40-
trackByDayOrWeekEvent
40+
trackByDayOrWeekEvent,
41+
isDraggedWithinPeriod
4142
} from '../common/util';
4243
import { DateAdapter } from '../../date-adapters/date-adapter';
4344
import { DragEndEvent } from 'angular-draggable-droppable';
@@ -521,24 +522,28 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
521522

522523
dragEnded(dayEvent: DayViewEvent, dragEndEvent: DragEndEvent): void {
523524
if (this.eventDragEnter > 0) {
524-
const minutesMoved = getMinutesMoved(
525+
let minutesMoved = getMinutesMoved(
525526
dragEndEvent.y,
526527
this.hourSegments,
527528
this.hourSegmentHeight,
528529
this.eventSnapSize
529530
);
530-
const newStart: Date = this.dateAdapter.addMinutes(
531+
let newStart: Date = this.dateAdapter.addMinutes(
531532
dayEvent.event.start,
532533
minutesMoved
533534
);
535+
if (dragEndEvent.y < 0 && newStart < this.view.period.start) {
536+
minutesMoved += this.dateAdapter.differenceInMinutes(
537+
this.view.period.start,
538+
newStart
539+
);
540+
newStart = this.view.period.start;
541+
}
534542
let newEnd: Date;
535543
if (dayEvent.event.end) {
536544
newEnd = this.dateAdapter.addMinutes(dayEvent.event.end, minutesMoved);
537545
}
538-
if (
539-
newStart >= this.view.period.start &&
540-
(newEnd || newStart) <= this.view.period.end
541-
) {
546+
if (isDraggedWithinPeriod(newStart, newEnd, this.view.period)) {
542547
this.eventTimesChanged.emit({
543548
newStart,
544549
newEnd,

src/modules/week/calendar-week-view.component.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ import {
4242
getDefaultEventEnd,
4343
getMinimumEventHeightInMinutes,
4444
addDaysWithExclusions,
45-
trackByDayOrWeekEvent
45+
trackByDayOrWeekEvent,
46+
isDraggedWithinPeriod
4647
} from '../common/util';
4748
import { DateAdapter } from '../../date-adapters/date-adapter';
4849
import {
@@ -862,8 +863,7 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
862863
);
863864
if (
864865
this.eventDragEnter > 0 &&
865-
start >= this.view.period.start &&
866-
(end || start) <= this.view.period.end
866+
isDraggedWithinPeriod(start, end, this.view.period)
867867
) {
868868
this.eventTimesChanged.emit({
869869
newStart: start,

test/calendar-day-view.component.spec.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,18 @@ describe('CalendarDayViewComponent component', () => {
881881
clientX: eventPosition.left + 10
882882
});
883883
fixture.detectChanges();
884-
expect(eventDropped).not.to.have.been.called;
884+
const { newStart, newEnd } = eventDropped.getCall(0).args[0];
885+
expect(newStart).to.deep.equal(
886+
moment('2016-06-27')
887+
.startOf('day')
888+
.toDate()
889+
);
890+
expect(newEnd).to.deep.equal(
891+
moment('2016-06-27')
892+
.startOf('day')
893+
.add(2, 'hours')
894+
.toDate()
895+
);
885896
fixture.destroy();
886897
});
887898

0 commit comments

Comments
 (0)