fix: only change availability details when entire range is covered by a template

This commit is contained in:
Freek van de Ven 2024-07-24 13:32:46 +02:00
parent 5d24fb490e
commit 40d80801a0

View file

@ -31,7 +31,10 @@ class AvailabilityViewModel {
List<AvailabilityWithTemplate> models,
DateTimeRange range,
) {
var coveredByAvailabilities = models.length == (range.duration.inDays + 1);
var coveredByAvailabilities = _rangeIsCoveredWithAvailabilities(
models.length,
range,
);
var userId = models.firstOrNull?.availabilityModel.userId;
// if there is no availability there is no conflicting time or pauses
var conflictingPauses = models.isNotEmpty;
@ -128,10 +131,15 @@ class AvailabilityViewModel {
var breaks = <BreakViewModel>[];
var appliedAvailabilities =
template.apply(selectedRange.start, selectedRange.end);
// If there are missing days in the range, the time cannot be applied
if (_rangeIsCoveredWithAvailabilities(
appliedAvailabilities.length,
selectedRange,
)) {
if (_availabilityTimesAreEqual(appliedAvailabilities)) {
conflictingTime = false;
startTime = TimeOfDay.fromDateTime(appliedAvailabilities.first.startDate);
startTime =
TimeOfDay.fromDateTime(appliedAvailabilities.first.startDate);
endTime = TimeOfDay.fromDateTime(appliedAvailabilities.first.endDate);
}
if (_availabilityBreaksAreEqual(appliedAvailabilities)) {
@ -140,6 +148,7 @@ class AvailabilityViewModel {
.map(BreakViewModel.fromAvailabilityBreakModel)
.toList();
}
}
return copyWith(
templates: [template],
@ -237,3 +246,10 @@ bool _availabilityBreaksAreEqual(List<AvailabilityModel> availabilityModels) {
var breaks = firstModel.breaks;
return availabilityModels.every((model) => model.breaksEqual(breaks));
}
/// Checks if there are as many availabilities as days in the range
bool _rangeIsCoveredWithAvailabilities(
int amountOfAvailabilities,
DateTimeRange range,
) =>
amountOfAvailabilities == (range.duration.inDays + 1);