Skip to content

Commit cb07924

Browse files
Hapcymattlewis92
authored andcommitted
fix: allow events to be dragged back to their original location
Closes #847
1 parent 65d354b commit cb07924

File tree

5 files changed

+153
-5
lines changed

5 files changed

+153
-5
lines changed

projects/angular-calendar/src/modules/common/calendar-drag-helper.provider.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ export class CalendarDragHelper {
1515
validateDrag({
1616
x,
1717
y,
18-
snapDraggedEvents
18+
snapDraggedEvents,
19+
dragAlreadyMoved
1920
}: {
2021
x: number;
2122
y: number;
2223
snapDraggedEvents: boolean;
24+
dragAlreadyMoved: boolean;
2325
}): boolean {
2426
const isWithinThreshold =
2527
Math.abs(x) > DRAG_THRESHOLD || Math.abs(y) > DRAG_THRESHOLD;
@@ -33,11 +35,11 @@ export class CalendarDragHelper {
3335
});
3436

3537
return (
36-
isWithinThreshold &&
38+
(isWithinThreshold || dragAlreadyMoved) &&
3739
isInside(this.dragContainerElement.getBoundingClientRect(), newRect)
3840
);
3941
} else {
40-
return isWithinThreshold;
42+
return isWithinThreshold || dragAlreadyMoved;
4143
}
4244
}
4345
}

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ export interface DayViewEventResize {
145145
"
146146
[validateDrag]="validateDrag"
147147
(dragPointerDown)="dragStarted(event, dayEventsContainer)"
148+
(dragging)="dragMove()"
148149
(dragEnd)="dragEnded(dayEvent, $event)"
149150
[style.marginTop.px]="dayEvent.top"
150151
[style.height.px]="dayEvent.height"
@@ -371,6 +372,11 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
371372
*/
372373
calendarId = Symbol('angular calendar day view id');
373374

375+
/**
376+
* @hidden
377+
*/
378+
dragAlreadyMoved = false;
379+
374380
/**
375381
* @hidden
376382
*/
@@ -561,12 +567,21 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
561567
dragHelper.validateDrag({
562568
x,
563569
y,
564-
snapDraggedEvents: this.snapDraggedEvents
570+
snapDraggedEvents: this.snapDraggedEvents,
571+
dragAlreadyMoved: this.dragAlreadyMoved
565572
});
566573
this.eventDragEnter = 0;
574+
this.dragAlreadyMoved = false;
567575
this.cdr.markForCheck();
568576
}
569577

578+
/**
579+
* @hidden
580+
*/
581+
dragMove() {
582+
this.dragAlreadyMoved = true;
583+
}
584+
570585
dragEnded(dayEvent: DayViewEvent, dragEndEvent: DragEndEvent): void {
571586
if (this.eventDragEnter > 0) {
572587
let minutesMoved = getMinutesMoved(

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ export interface CalendarWeekViewBeforeRenderEvent extends WeekView {
153153
[dragSnapGrid]="snapDraggedEvents ? { x: dayColumnWidth } : {}"
154154
[validateDrag]="validateDrag"
155155
(dragPointerDown)="dragStarted(eventRowContainer, event)"
156+
(dragging)="allDayEventDragMove()"
156157
(dragEnd)="dragEnded(allDayEvent, $event, dayColumnWidth)"
157158
>
158159
<div
@@ -556,6 +557,11 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
556557
*/
557558
dragActive = false;
558559

560+
/**
561+
* @hidden
562+
*/
563+
dragAlreadyMoved = false;
564+
559565
/**
560566
* @hidden
561567
*/
@@ -865,9 +871,11 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
865871
dragHelper.validateDrag({
866872
x,
867873
y,
868-
snapDraggedEvents: this.snapDraggedEvents
874+
snapDraggedEvents: this.snapDraggedEvents,
875+
dragAlreadyMoved: this.dragAlreadyMoved
869876
});
870877
this.dragActive = true;
878+
this.dragAlreadyMoved = false;
871879
this.eventDragEnter = 0;
872880
if (!this.snapDraggedEvents && dayEvent) {
873881
this.view.hourColumns.forEach(column => {
@@ -909,6 +917,14 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
909917
new Map([[adjustedEvent, originalEvent]])
910918
);
911919
}
920+
this.dragAlreadyMoved = true;
921+
}
922+
923+
/**
924+
* @hidden
925+
*/
926+
allDayEventDragMove() {
927+
this.dragAlreadyMoved = true;
912928
}
913929

914930
/**

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

+114
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,66 @@ describe('calendarWeekView component', () => {
16001600
});
16011601
});
16021602

1603+
it('should drag time events back to their original position while snapping to a grid', () => {
1604+
const fixture: ComponentFixture<
1605+
CalendarWeekViewComponent
1606+
> = TestBed.createComponent(CalendarWeekViewComponent);
1607+
fixture.componentInstance.viewDate = new Date('2018-07-29');
1608+
const originalEvent = {
1609+
start: moment(new Date('2018-07-29'))
1610+
.startOf('day')
1611+
.add(3, 'hours')
1612+
.toDate(),
1613+
end: moment(new Date('2018-07-29'))
1614+
.startOf('day')
1615+
.add(5, 'hours')
1616+
.toDate(),
1617+
title: 'foo',
1618+
draggable: true
1619+
};
1620+
fixture.componentInstance.events = [originalEvent];
1621+
fixture.componentInstance.ngOnChanges({ viewDate: {}, events: {} });
1622+
fixture.detectChanges();
1623+
document.body.appendChild(fixture.nativeElement);
1624+
const event = fixture.nativeElement.querySelector('.cal-event-container');
1625+
const rect: ClientRect = event.getBoundingClientRect();
1626+
let dragEvent: CalendarEventTimesChangedEvent;
1627+
fixture.componentInstance.eventTimesChanged.subscribe(e => {
1628+
dragEvent = e;
1629+
});
1630+
triggerDomEvent('mousedown', event, {
1631+
clientX: rect.right,
1632+
clientY: rect.bottom
1633+
});
1634+
fixture.detectChanges();
1635+
triggerDomEvent('mousemove', event, {
1636+
clientX: rect.right,
1637+
clientY: rect.bottom + 95
1638+
});
1639+
fixture.detectChanges();
1640+
const updatedEvent1 = fixture.nativeElement.querySelector(
1641+
'.cal-event-container'
1642+
);
1643+
expect(updatedEvent1.getBoundingClientRect().top).to.equal(rect.top + 90);
1644+
triggerDomEvent('mousemove', event, {
1645+
clientX: rect.right,
1646+
clientY: rect.bottom
1647+
});
1648+
fixture.detectChanges();
1649+
const updatedEvent2 = fixture.nativeElement.querySelector(
1650+
'.cal-event-container'
1651+
);
1652+
expect(updatedEvent2.getBoundingClientRect().top).to.equal(rect.top);
1653+
triggerDomEvent('mouseup', event, {
1654+
clientX: rect.right,
1655+
clientY: rect.bottom
1656+
});
1657+
fixture.detectChanges();
1658+
fixture.destroy();
1659+
expect(dragEvent.newStart).to.deep.equal(originalEvent.start);
1660+
expect(dragEvent.newEnd).to.deep.equal(originalEvent.end);
1661+
});
1662+
16031663
it('should drag time events without end dates', () => {
16041664
const fixture: ComponentFixture<
16051665
CalendarWeekViewComponent
@@ -1733,6 +1793,60 @@ describe('calendarWeekView component', () => {
17331793
});
17341794
});
17351795

1796+
it('should drag time events back to their original position while not snapping to a grid', () => {
1797+
const fixture: ComponentFixture<
1798+
CalendarWeekViewComponent
1799+
> = TestBed.createComponent(CalendarWeekViewComponent);
1800+
fixture.componentInstance.viewDate = new Date('2018-07-29');
1801+
const originalEvent = {
1802+
start: moment(new Date('2018-07-29'))
1803+
.startOf('day')
1804+
.add(3, 'hours')
1805+
.toDate(),
1806+
end: moment(new Date('2018-07-29'))
1807+
.startOf('day')
1808+
.add(5, 'hours')
1809+
.toDate(),
1810+
title: 'foo',
1811+
draggable: true
1812+
};
1813+
fixture.componentInstance.events = [originalEvent];
1814+
fixture.componentInstance.snapDraggedEvents = false;
1815+
fixture.componentInstance.ngOnChanges({ viewDate: {}, events: {} });
1816+
fixture.detectChanges();
1817+
document.body.appendChild(fixture.nativeElement);
1818+
const event = fixture.nativeElement.querySelector('.cal-event-container');
1819+
const rect: ClientRect = event.getBoundingClientRect();
1820+
let dragEvent: CalendarEventTimesChangedEvent;
1821+
fixture.componentInstance.eventTimesChanged.subscribe(e => {
1822+
dragEvent = e;
1823+
});
1824+
triggerDomEvent('mousedown', event, {
1825+
clientX: rect.left,
1826+
clientY: rect.top
1827+
});
1828+
const timeEvents = fixture.nativeElement.querySelector('.cal-time-events');
1829+
fixture.detectChanges();
1830+
triggerDomEvent('mousemove', timeEvents, {
1831+
clientX: rect.left,
1832+
clientY: rect.top + 95
1833+
});
1834+
fixture.detectChanges();
1835+
triggerDomEvent('mousemove', timeEvents, {
1836+
clientX: rect.left,
1837+
clientY: rect.top
1838+
});
1839+
fixture.detectChanges();
1840+
triggerDomEvent('mouseup', timeEvents, {
1841+
clientX: rect.left,
1842+
clientY: rect.top
1843+
});
1844+
fixture.detectChanges();
1845+
fixture.destroy();
1846+
expect(dragEvent.newStart).to.deep.equal(originalEvent.start);
1847+
expect(dragEvent.newEnd).to.deep.equal(originalEvent.end);
1848+
});
1849+
17361850
it('should drag an all day event onto the time grid', () => {
17371851
const fixture: ComponentFixture<
17381852
CalendarWeekViewComponent

projects/demos/app/demo-modules/day-view-scheduler/day-view-scheduler.component.html

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
}"
4141
[validateDrag]="validateDrag"
4242
(dragStart)="dragStarted(event, dayViewContainer)"
43+
(dragging)="dragMove()"
4344
(dragEnd)="eventDragged(dayEvent, $event.x, $event.y)"
4445
[style.marginTop.px]="dayEvent.top"
4546
[style.height.px]="dayEvent.height"

0 commit comments

Comments
 (0)