Skip to content

Commit ba45051

Browse files
committed
feat(week-view): allow customising where events can be resized
Closes #1183
1 parent cd12d3c commit ba45051

File tree

2 files changed

+379
-25
lines changed

2 files changed

+379
-25
lines changed

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

+86-25
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@ export class CalendarWeekViewComponent
838838
resizeEvent: ResizeEvent
839839
): void {
840840
this.timeEventResizes.set(timeEvent.event, resizeEvent);
841-
this.resizeStarted(eventsContainer);
841+
this.resizeStarted(eventsContainer, timeEvent);
842842
}
843843

844844
/**
@@ -900,6 +900,7 @@ export class CalendarWeekViewComponent
900900
});
901901
this.resizeStarted(
902902
allDayEventsContainer,
903+
allDayEvent,
903904
this.getDayColumnWidth(allDayEventsContainer)
904905
);
905906
}
@@ -949,27 +950,15 @@ export class CalendarWeekViewComponent
949950
allDayEvent.offset = currentResize.originalOffset;
950951
allDayEvent.span = currentResize.originalSpan;
951952

952-
let newStart: Date = allDayEvent.event.start;
953-
let newEnd: Date = allDayEvent.event.end || allDayEvent.event.start;
954-
if (allDayEventResizingBeforeStart) {
955-
newStart = addDaysWithExclusions(
956-
this.dateAdapter,
957-
newStart,
958-
daysDiff,
959-
this.excludeDays
960-
);
961-
} else {
962-
newEnd = addDaysWithExclusions(
963-
this.dateAdapter,
964-
newEnd,
965-
daysDiff,
966-
this.excludeDays
967-
);
968-
}
953+
const newDates = this.getAllDayEventResizedDates(
954+
allDayEvent.event,
955+
daysDiff,
956+
allDayEventResizingBeforeStart
957+
);
969958

970959
this.eventTimesChanged.emit({
971-
newStart,
972-
newEnd,
960+
newStart: newDates.start,
961+
newEnd: newDates.end,
973962
event: allDayEvent.event,
974963
type: CalendarEventTimesChangedEventType.Resize,
975964
});
@@ -1422,15 +1411,87 @@ export class CalendarWeekViewComponent
14221411
return newEventDates;
14231412
}
14241413

1425-
protected resizeStarted(eventsContainer: HTMLElement, minWidth?: number) {
1414+
protected resizeStarted(
1415+
eventsContainer: HTMLElement,
1416+
event: WeekViewTimeEvent | WeekViewAllDayEvent,
1417+
dayWidth?: number
1418+
) {
14261419
this.dayColumnWidth = this.getDayColumnWidth(eventsContainer);
1427-
const resizeHelper: CalendarResizeHelper = new CalendarResizeHelper(
1420+
const resizeHelper = new CalendarResizeHelper(
14281421
eventsContainer,
1429-
minWidth,
1422+
dayWidth,
14301423
this.rtl
14311424
);
1432-
this.validateResize = ({ rectangle, edges }) =>
1433-
resizeHelper.validateResize({ rectangle: { ...rectangle }, edges });
1425+
this.validateResize = ({ rectangle, edges }) => {
1426+
const isWithinBoundary = resizeHelper.validateResize({
1427+
rectangle: { ...rectangle },
1428+
edges,
1429+
});
1430+
1431+
if (isWithinBoundary && this.validateEventTimesChanged) {
1432+
let newEventDates;
1433+
if (!dayWidth) {
1434+
newEventDates = this.getTimeEventResizedDates(event.event, {
1435+
rectangle,
1436+
edges,
1437+
});
1438+
} else {
1439+
const modifier = this.rtl ? -1 : 1;
1440+
if (typeof edges.left !== 'undefined') {
1441+
const diff = Math.round(+edges.left / dayWidth) * modifier;
1442+
newEventDates = this.getAllDayEventResizedDates(
1443+
event.event,
1444+
diff,
1445+
!this.rtl
1446+
);
1447+
} else {
1448+
const diff = Math.round(+edges.right / dayWidth) * modifier;
1449+
newEventDates = this.getAllDayEventResizedDates(
1450+
event.event,
1451+
diff,
1452+
this.rtl
1453+
);
1454+
}
1455+
}
1456+
return this.validateEventTimesChanged({
1457+
type: CalendarEventTimesChangedEventType.Resize,
1458+
event: event.event,
1459+
newStart: newEventDates.start,
1460+
newEnd: newEventDates.end,
1461+
});
1462+
}
1463+
1464+
return isWithinBoundary;
1465+
};
14341466
this.cdr.markForCheck();
14351467
}
1468+
1469+
/**
1470+
* @hidden
1471+
*/
1472+
protected getAllDayEventResizedDates(
1473+
event: CalendarEvent,
1474+
daysDiff: number,
1475+
beforeStart: boolean
1476+
) {
1477+
let start: Date = event.start;
1478+
let end: Date = event.end || event.start;
1479+
if (beforeStart) {
1480+
start = addDaysWithExclusions(
1481+
this.dateAdapter,
1482+
start,
1483+
daysDiff,
1484+
this.excludeDays
1485+
);
1486+
} else {
1487+
end = addDaysWithExclusions(
1488+
this.dateAdapter,
1489+
end,
1490+
daysDiff,
1491+
this.excludeDays
1492+
);
1493+
}
1494+
1495+
return { start, end };
1496+
}
14361497
}

0 commit comments

Comments
 (0)