From 2179270f05f1e26febb9118039991f50581165fe Mon Sep 17 00:00:00 2001 From: doodlezucc <electerminator@gmail.com> Date: Tue, 14 Nov 2023 15:55:51 +0100 Subject: [PATCH] introduce views for lectures, rooms and teachers --- lib/main.dart | 1 + lib/timetable/lesson_chip.dart | 7 +++--- lib/timetable/lesson_chip_collection.dart | 8 +++++-- lib/timetable/lesson_dialog.dart | 26 ++++++++++++++++++++--- lib/untis/fetch.dart | 6 ++++-- lib/views/lecture_view.dart | 10 +++++++++ lib/views/room_view.dart | 10 +++++++++ lib/views/single_element_view.dart | 25 ++++++++++++++++++++++ lib/views/teacher_view.dart | 10 +++++++++ 9 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 lib/views/lecture_view.dart create mode 100644 lib/views/room_view.dart create mode 100644 lib/views/single_element_view.dart create mode 100644 lib/views/teacher_view.dart diff --git a/lib/main.dart b/lib/main.dart index baa6d4e..6297a60 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -98,6 +98,7 @@ class _MyHomePageState extends State<MyHomePage> { _subscriptions = [ profile.selectedClasses.onChange.listen((_) => fetchTimetable()), appContext.date.onChange.listen((_) => fetchTimetable()), + appContext.view.onChange.listen((_) => fetchTimetable()), ]; setState(() {}); diff --git a/lib/timetable/lesson_chip.dart b/lib/timetable/lesson_chip.dart index 0dcf4c6..ed772ef 100644 --- a/lib/timetable/lesson_chip.dart +++ b/lib/timetable/lesson_chip.dart @@ -4,15 +4,14 @@ import '../untis/element.dart'; class LessonChip extends StatelessWidget { final UntisElement data; + final void Function() onPressed; - const LessonChip(this.data, {super.key}); + const LessonChip(this.data, {super.key, required this.onPressed}); @override Widget build(BuildContext context) { return TextButton( - onPressed: () { - print('yeah'); - }, + onPressed: onPressed, child: Text(data.name, overflow: TextOverflow.ellipsis), ); } diff --git a/lib/timetable/lesson_chip_collection.dart b/lib/timetable/lesson_chip_collection.dart index f089d4e..47aafb5 100644 --- a/lib/timetable/lesson_chip_collection.dart +++ b/lib/timetable/lesson_chip_collection.dart @@ -6,8 +6,10 @@ import 'lesson_chip.dart'; class LessonChipCollection extends StatelessWidget { final IconData icon; final Iterable<UntisElement> elements; + final void Function(UntisElement element) onChipTap; - const LessonChipCollection(this.icon, this.elements, {super.key}); + const LessonChipCollection(this.icon, this.elements, + {super.key, required this.onChipTap}); @override Widget build(BuildContext context) { @@ -16,7 +18,9 @@ class LessonChipCollection extends StatelessWidget { Icon(icon, color: Theme.of(context).primaryColor), Expanded( child: Wrap( - children: elements.map((e) => LessonChip(e)).toList(), + children: elements + .map((e) => LessonChip(e, onPressed: () => onChipTap(e))) + .toList(), ), ) ], diff --git a/lib/timetable/lesson_dialog.dart b/lib/timetable/lesson_dialog.dart index 8e3dd0c..203f580 100644 --- a/lib/timetable/lesson_dialog.dart +++ b/lib/timetable/lesson_dialog.dart @@ -4,6 +4,10 @@ import '../branding.dart'; import '../context.dart'; import '../untis/lesson.dart'; import '../util/set_extension.dart'; +import '../views/lecture_view.dart'; +import '../views/room_view.dart'; +import '../views/teacher_view.dart'; +import '../views/view.dart'; import 'lesson_chip_collection.dart'; import 'weekday_header.dart'; @@ -49,6 +53,11 @@ class _LessonDialogState extends State<LessonDialog> { return '$weekday, $time'; } + void changeView(TimetableView view) { + widget.appContext.view.value = view; + Navigator.pop(context); + } + @override Widget build(BuildContext context) { return SimpleDialog( @@ -68,7 +77,10 @@ class _LessonDialogState extends State<LessonDialog> { children: [ Expanded( child: LessonChipCollection( - BrandingIcons.lecture, [lesson.lecture])), + BrandingIcons.lecture, + [lesson.lecture], + onChipTap: (e) => changeView(LectureView(lectureId: e.id)), + )), IconButton( onPressed: () { lectureVisible = !lectureVisible; @@ -80,10 +92,18 @@ class _LessonDialogState extends State<LessonDialog> { ), if (lesson.rooms.isNotEmpty) ...[ const Divider(), - LessonChipCollection(BrandingIcons.room, lesson.rooms), + LessonChipCollection( + BrandingIcons.room, + lesson.rooms, + onChipTap: (e) => changeView(RoomView(roomId: e.id)), + ), ], const Divider(), - LessonChipCollection(BrandingIcons.teacher, lesson.teachers), + LessonChipCollection( + BrandingIcons.teacher, + lesson.teachers, + onChipTap: (e) => changeView(TeacherView(teacherId: e.id)), + ), ], ); } diff --git a/lib/untis/fetch.dart b/lib/untis/fetch.dart index 0d84c01..c7a98cf 100644 --- a/lib/untis/fetch.dart +++ b/lib/untis/fetch.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import '../fetching/pageconfig.dart'; import '../fetching/timetable.dart'; +import '../util/date_extension.dart'; import 'class.dart'; import '../util/serializable.dart'; import 'element_type.dart'; @@ -45,11 +46,12 @@ class UntisFetch { required int elementId, required DateTime date, }) { - final TimetableOptions options = (type, elementId, date); + final startOfWeek = date.atStartOfWeek(); + final TimetableOptions options = (type, elementId, startOfWeek); return _timetables.putIfAbsent( options, () => CacheableTimetable(this, - date: date, type: type, elementId: elementId)); + date: startOfWeek, type: type, elementId: elementId)); } Uri _makeUri(RequestOptions options) { diff --git a/lib/views/lecture_view.dart b/lib/views/lecture_view.dart new file mode 100644 index 0000000..bcd499f --- /dev/null +++ b/lib/views/lecture_view.dart @@ -0,0 +1,10 @@ +import '../untis/element_type.dart'; + +import 'single_element_view.dart'; + +class LectureView extends SingleElementView { + LectureView({required int lectureId}) : super(elementId: lectureId); + + @override + ElementType get elementType => ElementType.lecture; +} diff --git a/lib/views/room_view.dart b/lib/views/room_view.dart new file mode 100644 index 0000000..65612e1 --- /dev/null +++ b/lib/views/room_view.dart @@ -0,0 +1,10 @@ +import '../untis/element_type.dart'; + +import 'single_element_view.dart'; + +class RoomView extends SingleElementView { + RoomView({required int roomId}) : super(elementId: roomId); + + @override + ElementType get elementType => ElementType.room; +} diff --git a/lib/views/single_element_view.dart b/lib/views/single_element_view.dart new file mode 100644 index 0000000..100bdf9 --- /dev/null +++ b/lib/views/single_element_view.dart @@ -0,0 +1,25 @@ +import '../untis/element.dart'; +import '../untis/element_type.dart'; +import '../untis/fetch.dart'; +import '../untis/timetable.dart'; +import 'dart:async'; + +import 'view.dart'; + +abstract class SingleElementView<T extends UntisElement> extends TimetableView { + final int elementId; + + SingleElementView({required this.elementId}); + + ElementType get elementType; + + @override + FutureOr<TimetableData?> timetableOf( + DateTime date, { + required UntisFetch untis, + }) { + return untis + .timetableOf(type: elementType, elementId: elementId, date: date) + .fetched; + } +} diff --git a/lib/views/teacher_view.dart b/lib/views/teacher_view.dart new file mode 100644 index 0000000..0e75cf8 --- /dev/null +++ b/lib/views/teacher_view.dart @@ -0,0 +1,10 @@ +import '../untis/element_type.dart'; + +import 'single_element_view.dart'; + +class TeacherView extends SingleElementView { + TeacherView({required int teacherId}) : super(elementId: teacherId); + + @override + ElementType get elementType => ElementType.teacher; +} -- GitLab