diff --git a/assets/translations/de.json b/assets/translations/de.json index 8948f7ad..35573283 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -235,5 +235,6 @@ "more": "Mehr", "visibility": "Sichtbarkeit", "utilizationAt": "Auslastung bei {}%", - "showStudentCardPicture": "Student Card Bild zeigen" + "showStudentCardPicture": "Student Card Bild zeigen", + "theses": "Abschlussarbeiten" } diff --git a/assets/translations/en.json b/assets/translations/en.json index 09570c12..61685587 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -235,5 +235,6 @@ "more": "More", "visibility": "Visibility", "utilizationAt": "Utilization at {}%", - "showStudentCardPicture": "Show Student Card Picture" + "showStudentCardPicture": "Show Student Card Picture", + "theses": "Theses" } diff --git a/lib/base/routing/router.dart b/lib/base/routing/router.dart index b6e6f1e4..6ee8aa06 100644 --- a/lib/base/routing/router.dart +++ b/lib/base/routing/router.dart @@ -36,8 +36,11 @@ import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart' import 'package:campus_flutter/searchComponent/views/search_scaffold.dart'; import 'package:campus_flutter/settingsComponent/views/settings_scaffold.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; +import 'package:campus_flutter/studiesComponent/screen/grades_screen.dart'; +import 'package:campus_flutter/studiesComponent/screen/lectures_screen.dart'; import 'package:campus_flutter/studiesComponent/screen/studies_screen.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_details_view.dart'; +import 'package:campus_flutter/studiesComponent/screen/theses_screen.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_details_view.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -146,6 +149,18 @@ final _router = GoRouter( ), ], ), + GoRoute( + path: grades, + builder: (context, state) => const GradesScreen(), + ), + GoRoute( + path: lectures, + builder: (context, state) => const LecturesScreen(), + ), + GoRoute( + path: theses, + builder: (context, state) => const ThesesScreen(), + ), GoRoute( path: lectureDetails, builder: diff --git a/lib/base/routing/routes.dart b/lib/base/routing/routes.dart index 7bdae67d..e98eab41 100644 --- a/lib/base/routing/routes.dart +++ b/lib/base/routing/routes.dart @@ -12,7 +12,10 @@ const fullScreenImage = "/fullScreenImage"; /// Studies tab const studies = "/studies"; +const grades = "/grades"; +const lectures = "/lectures"; const lectureDetails = "/lectureDetails"; +const theses = "/theses"; /// Calendar tab const calendar = "/calendar"; diff --git a/lib/studiesComponent/screen/grades_screen.dart b/lib/studiesComponent/screen/grades_screen.dart new file mode 100644 index 00000000..d8fa2b7b --- /dev/null +++ b/lib/studiesComponent/screen/grades_screen.dart @@ -0,0 +1,19 @@ +import 'package:campus_flutter/base/util/custom_back_button.dart'; +import 'package:campus_flutter/studiesComponent/view/grade/grades_view.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; + +class GradesScreen extends StatelessWidget { + const GradesScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: CustomBackButton(), + title: Text(context.tr("grades")), + ), + body: GradesView(), + ); + } +} diff --git a/lib/studiesComponent/screen/lectures_screen.dart b/lib/studiesComponent/screen/lectures_screen.dart new file mode 100644 index 00000000..6a88caec --- /dev/null +++ b/lib/studiesComponent/screen/lectures_screen.dart @@ -0,0 +1,19 @@ +import 'package:campus_flutter/base/util/custom_back_button.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectures_view.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; + +class LecturesScreen extends StatelessWidget { + const LecturesScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: CustomBackButton(), + title: Text(context.tr("lectures")), + ), + body: LecturesView(), + ); + } +} diff --git a/lib/studiesComponent/screen/studies_screen.dart b/lib/studiesComponent/screen/studies_screen.dart index 8e2670d3..feb0e821 100644 --- a/lib/studiesComponent/screen/studies_screen.dart +++ b/lib/studiesComponent/screen/studies_screen.dart @@ -1,8 +1,11 @@ -import 'package:campus_flutter/base/extensions/context.dart'; -import 'package:campus_flutter/studiesComponent/view/grade/grades_view.dart'; -import 'package:campus_flutter/studiesComponent/view/lecture/lectures_view.dart'; +import 'package:campus_flutter/base/routing/routes.dart'; +import 'package:campus_flutter/studiesComponent/view/grade/widget/grades_widget_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/widget/lectures_widget_view.dart'; +import 'package:campus_flutter/studiesComponent/view/studies_card_view.dart'; +import 'package:campus_flutter/studiesComponent/view/theses/widget/theses_widget_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; class StudiesScreen extends StatefulWidget { const StudiesScreen({super.key}); @@ -12,57 +15,39 @@ class StudiesScreen extends StatefulWidget { } class _StudiesScreenState extends State { - int selectedPage = 0; - PageController pageController = PageController(); - - final List pages = const [GradesView(), LecturesView()]; - - @override - void dispose() { - pageController.dispose(); - super.dispose(); - } - @override Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: context.padding), - child: SizedBox( - width: double.infinity, - child: SegmentedButton( - showSelectedIcon: false, - segments: [ - ButtonSegment(value: 0, label: Text(context.tr("grades"))), - ButtonSegment(value: 1, label: Text(context.tr("lectures"))), - ], - selected: {selectedPage}, - onSelectionChanged: (selection) { - setState(() { - selectedPage = selection.first; - }); - pageController.animateToPage( - selectedPage, - duration: const Duration(milliseconds: 300), - curve: Curves.easeInOut, - ); + return LayoutBuilder( + builder: (context, constraints) { + return Column( + children: [ + StudiesCardView( + title: context.tr("grades"), + body: GradesWidgetView(), + height: constraints.maxHeight / 3, + onTap: () { + context.push(grades); + }, + ), + StudiesCardView( + title: context.tr("lectures"), + body: LecturesWidgetView(), + height: constraints.maxHeight / 3, + onTap: () { + context.push(lectures); + }, + ), + StudiesCardView( + title: context.tr("theses"), + body: ThesesWidgetView(), + height: constraints.maxHeight / 3, + onTap: () { + context.push(theses); }, ), - ), - ), - Expanded( - child: PageView( - controller: pageController, - onPageChanged: (page) { - setState(() { - selectedPage = page; - }); - }, - children: pages, - ), - ), - ], + ], + ); + }, ); } } diff --git a/lib/studiesComponent/screen/theses_screen.dart b/lib/studiesComponent/screen/theses_screen.dart new file mode 100644 index 00000000..6636ffe7 --- /dev/null +++ b/lib/studiesComponent/screen/theses_screen.dart @@ -0,0 +1,18 @@ +import 'package:campus_flutter/base/util/custom_back_button.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; + +class ThesesScreen extends StatelessWidget { + const ThesesScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: CustomBackButton(), + title: Text(context.tr("theses")), + ), + body: Text("Theses"), + ); + } +} diff --git a/lib/studiesComponent/view/grade/widget/grades_widget_view.dart b/lib/studiesComponent/view/grade/widget/grades_widget_view.dart new file mode 100644 index 00000000..bc22cb52 --- /dev/null +++ b/lib/studiesComponent/view/grade/widget/grades_widget_view.dart @@ -0,0 +1,29 @@ +import 'package:campus_flutter/studiesComponent/viewModel/grade_viewmodel.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class GradesWidgetView extends ConsumerStatefulWidget { + const GradesWidgetView({super.key}); + + @override + ConsumerState createState() => + _GradesWidgetViewState(); +} + +class _GradesWidgetViewState extends ConsumerState { + @override + void initState() { + ref.read(gradeViewModel).fetch(false); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + context.tr("grades"), + ), + ); + } +} diff --git a/lib/studiesComponent/view/lectureDetail/basic_lecture_info_row_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_row_view.dart similarity index 100% rename from lib/studiesComponent/view/lectureDetail/basic_lecture_info_row_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_row_view.dart diff --git a/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_view.dart similarity index 92% rename from lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_view.dart index ab9792ec..c15ef2a4 100644 --- a/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart +++ b/lib/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_view.dart @@ -2,9 +2,9 @@ import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/base/util/speaker.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/model/lecture_details.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/basic_lecture_info_row_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_row_view.dart'; import 'package:campus_flutter/base/extensions/context.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_info_card_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; diff --git a/lib/studiesComponent/view/lectureDetail/detailed_lecture_info_row_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_row_view.dart similarity index 100% rename from lib/studiesComponent/view/lectureDetail/detailed_lecture_info_row_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_row_view.dart diff --git a/lib/studiesComponent/view/lectureDetail/detailed_lecture_info_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_view.dart similarity index 84% rename from lib/studiesComponent/view/lectureDetail/detailed_lecture_info_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_view.dart index c8a6bdfb..f573b188 100644 --- a/lib/studiesComponent/view/lectureDetail/detailed_lecture_info_view.dart +++ b/lib/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_view.dart @@ -1,6 +1,6 @@ import 'package:campus_flutter/studiesComponent/model/lecture_details.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/detailed_lecture_info_row_view.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_info_card_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_row_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/lib/studiesComponent/view/lectureDetail/lecture_details_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/lecture_details_view.dart similarity index 93% rename from lib/studiesComponent/view/lectureDetail/lecture_details_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/lecture_details_view.dart index 057796b5..da039b6f 100644 --- a/lib/studiesComponent/view/lectureDetail/lecture_details_view.dart +++ b/lib/studiesComponent/view/lecture/lectureDetail/lecture_details_view.dart @@ -9,10 +9,10 @@ import 'package:campus_flutter/base/util/color_picker_view.dart'; import 'package:campus_flutter/calendarComponent/views/visibility_button_view.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/model/lecture_details.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/detailed_lecture_info_view.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_links_view.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/detailed_lecture_info_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_links_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_meeting_info_view.dart'; import 'package:campus_flutter/studiesComponent/viewModel/lecture_details_viewmodel.dart'; import 'package:campus_flutter/base/extensions/context.dart'; import 'package:easy_localization/easy_localization.dart'; diff --git a/lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart similarity index 100% rename from lib/studiesComponent/view/lectureDetail/lecture_info_card_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart diff --git a/lib/studiesComponent/view/lectureDetail/lecture_links_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/lecture_links_view.dart similarity index 92% rename from lib/studiesComponent/view/lectureDetail/lecture_links_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/lecture_links_view.dart index acdacea2..92cfa5bc 100644 --- a/lib/studiesComponent/view/lectureDetail/lecture_links_view.dart +++ b/lib/studiesComponent/view/lecture/lectureDetail/lecture_links_view.dart @@ -1,6 +1,6 @@ import 'package:campus_flutter/base/util/hyperlink_text.dart'; import 'package:campus_flutter/studiesComponent/model/lecture_details.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_info_card_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart b/lib/studiesComponent/view/lecture/lectureDetail/lecture_meeting_info_view.dart similarity index 87% rename from lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart rename to lib/studiesComponent/view/lecture/lectureDetail/lecture_meeting_info_view.dart index eed03ed3..1e48c90b 100644 --- a/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart +++ b/lib/studiesComponent/view/lecture/lectureDetail/lecture_meeting_info_view.dart @@ -1,7 +1,7 @@ import 'package:campus_flutter/base/routing/routes.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_info_card_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/lecture_info_card_view.dart'; import 'package:campus_flutter/studiesComponent/viewModel/lecture_details_viewmodel.dart'; -import 'package:campus_flutter/studiesComponent/view/lectureDetail/basic_lecture_info_row_view.dart'; +import 'package:campus_flutter/studiesComponent/view/lecture/lectureDetail/basic_lecture_info_row_view.dart'; import 'package:campus_flutter/base/extensions/context.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/lib/studiesComponent/view/lecture/widget/lectures_widget_view.dart b/lib/studiesComponent/view/lecture/widget/lectures_widget_view.dart new file mode 100644 index 00000000..c3119475 --- /dev/null +++ b/lib/studiesComponent/view/lecture/widget/lectures_widget_view.dart @@ -0,0 +1,29 @@ +import 'package:campus_flutter/studiesComponent/viewModel/lecture_viewmodel.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class LecturesWidgetView extends ConsumerStatefulWidget { + const LecturesWidgetView({super.key}); + + @override + ConsumerState createState() => + _LecturesWidgetViewState(); +} + +class _LecturesWidgetViewState extends ConsumerState { + @override + void initState() { + ref.read(lectureViewModel).fetch(false); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + context.tr("lectures"), + ), + ); + } +} diff --git a/lib/studiesComponent/view/studies_card_view.dart b/lib/studiesComponent/view/studies_card_view.dart new file mode 100644 index 00000000..9824569f --- /dev/null +++ b/lib/studiesComponent/view/studies_card_view.dart @@ -0,0 +1,36 @@ +import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart'; +import 'package:flutter/material.dart'; + +class StudiesCardView extends StatelessWidget { + const StudiesCardView({ + super.key, + required this.title, + required this.body, + required this.height, + required this.onTap, + }); + + final String title; + final Widget body; + final double height; + final void Function() onTap; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: height, + width: double.maxFinite, + child: WidgetFrameView( + title: title, + child: Expanded( + child: InkWell( + onTap: onTap, + child: Card( + child: body, + ), + ), + ), + ), + ); + } +} diff --git a/lib/studiesComponent/view/theses/widget/theses_widget_view.dart b/lib/studiesComponent/view/theses/widget/theses_widget_view.dart new file mode 100644 index 00000000..7ed1ac4a --- /dev/null +++ b/lib/studiesComponent/view/theses/widget/theses_widget_view.dart @@ -0,0 +1,28 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class ThesesWidgetView extends ConsumerStatefulWidget { + const ThesesWidgetView({super.key}); + + @override + ConsumerState createState() => + _ThesesWidgetViewState(); +} + +class _ThesesWidgetViewState extends ConsumerState { + @override + void initState() { + // TODO: fetch available theses offers + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + context.tr("theses"), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index f19a58ef..dedd558f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: @@ -948,10 +948,10 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" package_info_plus: dependency: "direct main" description: @@ -1497,10 +1497,10 @@ packages: dependency: "direct main" description: name: syncfusion_flutter_datepicker - sha256: "7e598b8933d906ef7a3b8f47c59e942409f71c8e59e3d1b88e67acc9eea48817" + sha256: "73ece73742f123c750d674461c6902cbdf32fbd695c15fdf7e8487d290bb7179" url: "https://pub.dev" source: hosted - version: "28.2.11" + version: "28.2.11+1" synchronized: dependency: transitive description: @@ -1697,10 +1697,10 @@ packages: dependency: transitive description: name: video_player_android - sha256: d949a83d1a333178eb3a9683f70afa41b7771c2bfa4cedd894fe836942de06b1 + sha256: ae7d4f1b41e3ac6d24dd9b9d5d6831b52d74a61bdd90a7a6262a33d8bb97c29a url: "https://pub.dev" source: hosted - version: "2.8.1" + version: "2.8.2" video_player_avfoundation: dependency: transitive description: @@ -1777,10 +1777,10 @@ packages: dependency: transitive description: name: win32 - sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef + sha256: dc6ecaa00a7c708e5b4d10ee7bec8c270e9276dfcab1783f57e9962d7884305f url: "https://pub.dev" source: hosted - version: "5.11.0" + version: "5.12.0" win32_registry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2cd268c2..054cb29d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: campus_flutter description: "TUM Campus App" publish_to: 'none' -version: 5.1.4+1 +version: 5.2.0+1 environment: sdk: ^3.7.0 @@ -38,10 +38,10 @@ dependencies: auto_size_text: ^3.0.0 quick_actions: ^1.0.7 flutter_native_splash: ^2.2.19 - syncfusion_flutter_core: ^28.1.39 - syncfusion_flutter_calendar: ^28.1.39 - syncfusion_flutter_charts: ^28.1.39 - syncfusion_flutter_datepicker: ^28.1.39 + syncfusion_flutter_core: ^28.1.41 + syncfusion_flutter_calendar: ^28.1.41 + syncfusion_flutter_charts: ^28.1.41 + syncfusion_flutter_datepicker: ^28.1.41 google_maps_flutter: ^2.5.3 video_player: ^2.6.1 barcode_widget: ^2.0.4