courseTableGridRange function
Implementation
CourseTableGridRange courseTableGridRange(CourseTableData courseTableData) {
final weekdays = DayOfWeek.values
.where((day) => day.isWeekday)
.toList(growable: false);
final defaultPeriods = Period.values
.where(
(period) => period.isAM || period == .nPeriod || period.isPM,
)
.toList(growable: false);
if (courseTableData.scheduled.isEmpty &&
courseTableData.unscheduled.isEmpty) {
return (visibleDaysOfWeek: weekdays, visiblePeriods: defaultPeriods);
}
final visibleDays = switch ((
courseTableData.hasWeekdayCourse,
courseTableData.hasSaturdayCourse,
courseTableData.hasSundayCourse,
)) {
(true, true, true) => [...weekdays, DayOfWeek.saturday, DayOfWeek.sunday],
(true, true, false) => [...weekdays, DayOfWeek.saturday],
(true, false, true) => [...weekdays, DayOfWeek.sunday],
(true, false, false) => [...weekdays],
(false, true, true) => [DayOfWeek.saturday, DayOfWeek.sunday],
(false, true, false) => [DayOfWeek.saturday],
(false, false, true) => [DayOfWeek.sunday],
(false, false, false) => <DayOfWeek>[],
};
final visiblePeriods = <Period>[];
void addPeriod(Period period) {
if (!visiblePeriods.contains(period)) {
visiblePeriods.add(period);
}
}
void addPeriods(Iterable<Period> periods) {
for (final period in periods) {
addPeriod(period);
}
}
switch ((
courseTableData.hasAMCourse,
courseTableData.hasNoonCourse,
courseTableData.hasPMCourse,
)) {
case (false, false, false):
break;
case (true, false, false):
addPeriods(Period.values.where((period) => period.isAM));
break;
case (false, true, false):
addPeriod(.nPeriod);
break;
case (false, false, true):
addPeriods(Period.values.where((period) => period.isPM));
break;
case (true, true, false):
addPeriods(Period.values.where((period) => period.isAM));
addPeriod(.nPeriod);
break;
case (false, true, true):
addPeriod(.nPeriod);
addPeriods(Period.values.where((period) => period.isPM));
break;
case (true, false, true):
case (true, true, true):
addPeriods(Period.values.where((period) => period.isAM));
addPeriod(.nPeriod);
addPeriods(Period.values.where((period) => period.isPM));
break;
}
final isEveningOnly =
!courseTableData.hasAMCourse &&
!courseTableData.hasPMCourse &&
courseTableData.hasEveningCourse;
switch ((
courseTableData.hasEveningCourse,
isEveningOnly,
courseTableData.latestPeriod,
)) {
case (false, _, _):
break;
case (true, true, _):
addPeriods(Period.values.where((period) => period.isEvening));
break;
case (true, false, Period lastPeriod):
addPeriods(
Period.values
.skip(visiblePeriods.last.index + 1)
.take(lastPeriod.index - visiblePeriods.last.index),
);
break;
case (true, false, null):
break;
}
return (
visibleDaysOfWeek: visibleDays.isEmpty ? weekdays : visibleDays,
visiblePeriods: visiblePeriods.isEmpty ? defaultPeriods : visiblePeriods,
);
}