Enabled Webuntis Holiday query Implemented Holiday view in Timetable Hide other special time regions like breaks when shown in holiday
126 lines
3.8 KiB
Dart
126 lines
3.8 KiB
Dart
import 'package:intl/intl.dart';
|
|
|
|
import '../../api/apiResponse.dart';
|
|
import '../../api/webuntis/queries/getHolidays/getHolidaysCache.dart';
|
|
import '../../api/webuntis/queries/getHolidays/getHolidaysResponse.dart';
|
|
import '../../api/webuntis/queries/getRooms/getRoomsCache.dart';
|
|
import '../../api/webuntis/queries/getRooms/getRoomsResponse.dart';
|
|
import '../../api/webuntis/queries/getSubjects/getSubjectsCache.dart';
|
|
import '../../api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
|
|
import '../../api/webuntis/queries/getTimetable/getTimetableCache.dart';
|
|
import '../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';
|
|
import '../../api/webuntis/webuntisError.dart';
|
|
import '../dataHolder.dart';
|
|
|
|
extension DateTimeExtension on DateTime {
|
|
DateTime jumpToNextWeekDay(int day) {
|
|
return add(
|
|
Duration(
|
|
days: (day - weekday) % DateTime.daysPerWeek,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class TimetableProps extends DataHolder {
|
|
final _queryWeek = DateTime.now().add(const Duration(days: 2));
|
|
|
|
late DateTime startDate = getDate(_queryWeek.subtract(Duration(days: _queryWeek.weekday - 1)));
|
|
late DateTime endDate = getDate(_queryWeek.add(Duration(days: DateTime.daysPerWeek - _queryWeek.weekday - 2)));
|
|
|
|
GetTimetableResponse? _getTimetableResponse;
|
|
GetTimetableResponse get getTimetableResponse => _getTimetableResponse!;
|
|
|
|
GetRoomsResponse? _getRoomsResponse;
|
|
GetRoomsResponse get getRoomsResponse => _getRoomsResponse!;
|
|
|
|
GetSubjectsResponse? _getSubjectsResponse;
|
|
GetSubjectsResponse get getSubjectsResponse => _getSubjectsResponse!;
|
|
|
|
GetHolidaysResponse? _getHolidaysResponse;
|
|
GetHolidaysResponse get getHolidaysResponse => _getHolidaysResponse!;
|
|
|
|
WebuntisError? error;
|
|
WebuntisError? get getError => error;
|
|
bool get hasError => error != null;
|
|
|
|
@override
|
|
List<ApiResponse?> properties() {
|
|
return [_getTimetableResponse, _getRoomsResponse, _getSubjectsResponse, _getHolidaysResponse];
|
|
}
|
|
|
|
@override
|
|
void run() {
|
|
GetTimetableCache(
|
|
startdate: int.parse(DateFormat("yyyyMMdd").format(startDate)),
|
|
enddate: int.parse(DateFormat("yyyyMMdd").format(endDate)),
|
|
onUpdate: (GetTimetableResponse data) => {
|
|
_getTimetableResponse = data,
|
|
notifyListeners(),
|
|
},
|
|
onError: (Exception e) => {
|
|
error = e as WebuntisError?,
|
|
notifyListeners(),
|
|
}
|
|
);
|
|
|
|
GetRoomsCache(
|
|
onUpdate: (GetRoomsResponse data) => {
|
|
_getRoomsResponse = data,
|
|
notifyListeners(),
|
|
}
|
|
);
|
|
|
|
GetSubjectsCache(
|
|
onUpdate: (GetSubjectsResponse data) => {
|
|
_getSubjectsResponse = data,
|
|
notifyListeners(),
|
|
}
|
|
);
|
|
|
|
GetHolidaysCache( // This broke in the past. Below here is backup simulation for an empty holiday block
|
|
onUpdate: (GetHolidaysResponse data) => {
|
|
_getHolidaysResponse = data,
|
|
notifyListeners(),
|
|
}
|
|
);
|
|
// _getHolidaysResponse = GetHolidaysResponse.fromJson(jsonDecode("""
|
|
// {"jsonrpc":"2.0","id":"ID","result":[]}
|
|
// """));
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
DateTime getDate(DateTime d) => DateTime(d.year, d.month, d.day);
|
|
|
|
bool isWeekend(DateTime queryDate) {
|
|
return queryDate.weekday == DateTime.saturday || queryDate.weekday == DateTime.sunday;
|
|
}
|
|
|
|
void updateWeek(DateTime start, DateTime end) {
|
|
properties().forEach((element) => element = null);
|
|
error = null;
|
|
notifyListeners();
|
|
startDate = start;
|
|
endDate = end;
|
|
try {
|
|
run();
|
|
} on WebuntisError catch(e) {
|
|
error = e;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
void resetWeek() {
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
DateTime queryWeek = DateTime.now().add(const Duration(days: 2));
|
|
|
|
startDate = getDate(queryWeek.subtract(Duration(days: queryWeek.weekday - 1)));
|
|
endDate = getDate(queryWeek.add(Duration(days: DateTime.daysPerWeek - queryWeek.weekday)));
|
|
|
|
run();
|
|
notifyListeners();
|
|
}
|
|
} |