Skip to content

Commit 5d1c69a

Browse files
committed
fix(week-view): handle dragging and resizing across excluded days
1 parent 47892c6 commit 5d1c69a

File tree

2 files changed

+107
-6
lines changed

2 files changed

+107
-6
lines changed

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

+36-6
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,19 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
820820
let newStart: Date = allDayEvent.event.start;
821821
let newEnd: Date = allDayEvent.event.end || allDayEvent.event.start;
822822
if (allDayEventResizingBeforeStart) {
823-
newStart = this.dateAdapter.addDays(newStart, daysDiff);
823+
newStart = addDaysWithExclusions(
824+
this.dateAdapter,
825+
newStart,
826+
daysDiff,
827+
this.excludeDays
828+
);
824829
} else {
825-
newEnd = this.dateAdapter.addDays(newEnd, daysDiff);
830+
newEnd = addDaysWithExclusions(
831+
this.dateAdapter,
832+
newEnd,
833+
daysDiff,
834+
this.excludeDays
835+
);
826836
}
827837

828838
this.eventTimesChanged.emit({
@@ -1048,13 +1058,23 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
10481058
: 0;
10491059

10501060
const start = this.dateAdapter.addMinutes(
1051-
this.dateAdapter.addDays(weekEvent.event.start, daysDragged),
1061+
addDaysWithExclusions(
1062+
this.dateAdapter,
1063+
weekEvent.event.start,
1064+
daysDragged,
1065+
this.excludeDays
1066+
),
10521067
minutesMoved
10531068
);
10541069
let end: Date;
10551070
if (weekEvent.event.end) {
10561071
end = this.dateAdapter.addMinutes(
1057-
this.dateAdapter.addDays(weekEvent.event.end, daysDragged),
1072+
addDaysWithExclusions(
1073+
this.dateAdapter,
1074+
weekEvent.event.end,
1075+
daysDragged,
1076+
this.excludeDays
1077+
),
10581078
minutesMoved
10591079
);
10601080
}
@@ -1129,7 +1149,12 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
11291149
const daysDiff = Math.round(
11301150
+resizeEvent.edges.left / this.dayColumnWidth
11311151
);
1132-
const newStart = this.dateAdapter.addDays(newEventDates.start, daysDiff);
1152+
const newStart = addDaysWithExclusions(
1153+
this.dateAdapter,
1154+
newEventDates.start,
1155+
daysDiff,
1156+
this.excludeDays
1157+
);
11331158
if (newStart < smallestResizes.start) {
11341159
newEventDates.start = newStart;
11351160
} else {
@@ -1139,7 +1164,12 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
11391164
const daysDiff = Math.round(
11401165
+resizeEvent.edges.right / this.dayColumnWidth
11411166
);
1142-
const newEnd = this.dateAdapter.addDays(newEventDates.end, daysDiff);
1167+
const newEnd = addDaysWithExclusions(
1168+
this.dateAdapter,
1169+
newEventDates.end,
1170+
daysDiff,
1171+
this.excludeDays
1172+
);
11431173
if (newEnd > smallestResizes.end) {
11441174
newEventDates.end = newEnd;
11451175
} else {

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

+71
Original file line numberDiff line numberDiff line change
@@ -2041,4 +2041,75 @@ describe('calendarWeekView component', () => {
20412041
fixture.detectChanges();
20422042
fixture.destroy();
20432043
});
2044+
2045+
it('should drag time events to different days and columns while snapping to a grid and excluding weekends', () => {
2046+
const fixture: ComponentFixture<
2047+
CalendarWeekViewComponent
2048+
> = TestBed.createComponent(CalendarWeekViewComponent);
2049+
fixture.componentInstance.viewDate = new Date('2019-03-01');
2050+
fixture.componentInstance.excludeDays = [0, 6];
2051+
fixture.componentInstance.daysInWeek = 4;
2052+
fixture.componentInstance.events = [
2053+
{
2054+
start: moment(new Date('2019-03-01'))
2055+
.startOf('day')
2056+
.add(3, 'hours')
2057+
.toDate(),
2058+
end: moment(new Date('2019-03-01'))
2059+
.startOf('day')
2060+
.add(18, 'hours')
2061+
.toDate(),
2062+
title: 'foo',
2063+
draggable: true
2064+
}
2065+
];
2066+
fixture.componentInstance.ngOnChanges({
2067+
viewDate: {},
2068+
events: {},
2069+
excludeDays: {},
2070+
daysInWeek: {}
2071+
});
2072+
fixture.detectChanges();
2073+
document.body.appendChild(fixture.nativeElement);
2074+
const events = fixture.nativeElement.querySelectorAll(
2075+
'.cal-event-container'
2076+
);
2077+
const dayWidth: number = events[0].parentElement.offsetWidth;
2078+
const rect1: ClientRect = events[0].getBoundingClientRect();
2079+
let dragEvent: CalendarEventTimesChangedEvent;
2080+
fixture.componentInstance.eventTimesChanged.subscribe(e => {
2081+
dragEvent = e;
2082+
});
2083+
triggerDomEvent('mousedown', events[0], {
2084+
clientX: rect1.right,
2085+
clientY: rect1.bottom
2086+
});
2087+
fixture.detectChanges();
2088+
triggerDomEvent('mousemove', events[0], {
2089+
clientX: rect1.right + dayWidth - 5,
2090+
clientY: rect1.bottom + 95
2091+
});
2092+
fixture.detectChanges();
2093+
triggerDomEvent('mouseup', events[0], {
2094+
clientX: rect1.right + dayWidth - 5,
2095+
clientY: rect1.bottom + 95
2096+
});
2097+
fixture.detectChanges();
2098+
fixture.destroy();
2099+
expect(dragEvent).to.deep.equal({
2100+
type: 'drag',
2101+
allDay: false,
2102+
event: fixture.componentInstance.events[0],
2103+
newStart: moment(fixture.componentInstance.events[0].start)
2104+
.add(3, 'days')
2105+
.add(1, 'hour')
2106+
.add(30, 'minutes')
2107+
.toDate(),
2108+
newEnd: moment(fixture.componentInstance.events[0].end)
2109+
.add(3, 'days')
2110+
.add(1, 'hour')
2111+
.add(30, 'minutes')
2112+
.toDate()
2113+
});
2114+
});
20442115
});

0 commit comments

Comments
 (0)