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