Skip to content

Commit 253ef80

Browse files
committed
fix(week-view): allow dragging all day events multiple times
Fixes #1173
1 parent ab957a6 commit 253ef80

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

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

+14-2
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,11 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
652652
*/
653653
calendarId = Symbol('angular calendar week view id');
654654

655+
/**
656+
* @hidden
657+
*/
658+
lastDraggedEvent: CalendarEvent;
659+
655660
/**
656661
* @hidden
657662
*/
@@ -937,7 +942,9 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
937942
): void {
938943
if (
939944
shouldFireDroppedEvent(dropEvent, date, allDay, this.calendarId) &&
940-
this.lastDragEnterDate.getTime() === date.getTime()
945+
this.lastDragEnterDate.getTime() === date.getTime() &&
946+
(!this.snapDraggedEvents ||
947+
dropEvent.dropData.event !== this.lastDraggedEvent)
941948
) {
942949
this.eventTimesChanged.emit({
943950
type: CalendarEventTimesChangedEventType.Drop,
@@ -946,6 +953,7 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
946953
allDay,
947954
});
948955
}
956+
this.lastDraggedEvent = null;
949957
}
950958

951959
/**
@@ -987,6 +995,7 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
987995
});
988996
this.dragActive = true;
989997
this.dragAlreadyMoved = false;
998+
this.lastDraggedEvent = null;
990999
this.eventDragEnterByType = {
9911000
allDay: 0,
9921001
time: 0,
@@ -1052,16 +1061,19 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
10521061
): void {
10531062
this.view = this.getWeekView(this.events);
10541063
this.dragActive = false;
1064+
this.validateDrag = null;
10551065
const { start, end } = this.getDragMovedEventTimes(
10561066
weekEvent,
10571067
dragEndEvent,
10581068
dayWidth,
10591069
useY
10601070
);
10611071
if (
1062-
this.eventDragEnterByType[useY ? 'time' : 'allDay'] > 0 &&
1072+
(this.snapDraggedEvents ||
1073+
this.eventDragEnterByType[useY ? 'time' : 'allDay'] > 0) &&
10631074
isDraggedWithinPeriod(start, end, this.view.period)
10641075
) {
1076+
this.lastDraggedEvent = weekEvent.event;
10651077
this.eventTimesChanged.emit({
10661078
newStart: start,
10671079
newEnd: end,

projects/angular-calendar/test/calendar-week-view.component.spec.ts

+52
Original file line numberDiff line numberDiff line change
@@ -2481,5 +2481,57 @@ describe('calendarWeekView component', () => {
24812481
);
24822482
expect(marker.style.top).to.equal('2760px');
24832483
});
2484+
2485+
it('should not change the all day event end date when ending the drop inside the hour grid', () => {
2486+
const fixture: ComponentFixture<CalendarWeekViewComponent> = TestBed.createComponent(
2487+
CalendarWeekViewComponent
2488+
);
2489+
fixture.componentInstance.viewDate = new Date();
2490+
fixture.componentInstance.events = [
2491+
{
2492+
title: 'foo',
2493+
start: moment().startOf('week').toDate(),
2494+
end: moment().startOf('week').add(2, 'days').toDate(),
2495+
draggable: true,
2496+
allDay: true,
2497+
},
2498+
];
2499+
fixture.componentInstance.ngOnChanges({ viewDate: {}, events: {} });
2500+
fixture.detectChanges();
2501+
document.body.appendChild(fixture.nativeElement);
2502+
// remove the header as it was causing the test to fail
2503+
const header: HTMLElement = fixture.nativeElement.querySelector(
2504+
'.cal-day-headers'
2505+
);
2506+
header.parentNode.removeChild(header);
2507+
2508+
const eventDropped = sinon.spy();
2509+
fixture.componentInstance.eventTimesChanged.subscribe(eventDropped);
2510+
2511+
const event: HTMLElement = fixture.nativeElement.querySelector(
2512+
'.cal-event-container'
2513+
);
2514+
const dayWidth: number = event.parentElement.offsetWidth / 7;
2515+
const eventPosition: ClientRect = event.getBoundingClientRect();
2516+
triggerDomEvent('mousedown', event, {
2517+
clientX: eventPosition.right,
2518+
clientY: eventPosition.top,
2519+
button: 0,
2520+
});
2521+
fixture.detectChanges();
2522+
triggerDomEvent('mousemove', document.body, {
2523+
clientX: eventPosition.right + dayWidth,
2524+
clientY: eventPosition.top + 100,
2525+
});
2526+
fixture.detectChanges();
2527+
triggerDomEvent('mouseup', document.body, {
2528+
clientX: eventPosition.right + dayWidth,
2529+
clientY: eventPosition.top + 100,
2530+
button: 0,
2531+
});
2532+
fixture.detectChanges();
2533+
2534+
expect(eventDropped).to.have.been.calledOnce;
2535+
});
24842536
});
24852537
});

0 commit comments

Comments
 (0)