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 committed by Bart Ribbers
parent b78029f018
commit 3280d40d1f

View file

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