omfg really sok progress

This commit is contained in:
Kima
2024-05-04 22:11:29 +02:00
parent 6b8708e1e3
commit 3b1e345f14
14 changed files with 689 additions and 161 deletions

View File

@@ -19,6 +19,7 @@ import 'package:refilc_kreta_api/models/subject.dart';
import 'package:refilc_kreta_api/models/group_average.dart';
import 'package:refilc_kreta_api/providers/homework_provider.dart';
import 'package:refilc_mobile_ui/common/average_display.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
import 'package:refilc_mobile_ui/common/empty.dart';
import 'package:refilc_mobile_ui/common/panel/panel.dart';
@@ -32,6 +33,9 @@ import 'package:refilc_mobile_ui/pages/grades/fail_warning.dart';
import 'package:refilc_mobile_ui/pages/grades/grades_count.dart';
import 'package:refilc_mobile_ui/pages/grades/graph.dart';
import 'package:refilc_mobile_ui/pages/grades/grade_subject_view.dart';
import 'package:refilc_mobile_ui/pages/timetable/timetable_page.dart';
import 'package:refilc_mobile_ui/screens/navigation/navigation_route_handler.dart';
import 'package:refilc_mobile_ui/screens/navigation/navigation_screen.dart';
import 'package:refilc_plus/models/premium_scopes.dart';
import 'package:refilc_plus/providers/plus_provider.dart';
import 'package:flutter/material.dart';
@@ -48,6 +52,19 @@ import 'grades_page.i18n.dart';
class GradesPage extends StatefulWidget {
const GradesPage({super.key});
static void jump(BuildContext context, {GradeSubject? subject}) {
// Go to timetable page with arguments
NavigationScreen.of(context)
?.customRoute(navigationPageRoute((context) => const GradesPage()));
NavigationScreen.of(context)?.setPage("grades");
// Show initial Lesson
if (subject != null) {
GradeSubjectView(subject, groupAverage: 0.0).push(context, root: true);
}
}
@override
GradesPageState createState() => GradesPageState();
}
@@ -147,7 +164,8 @@ class GradesPageState extends State<GradesPage> {
Exam? nearestExam = allExams.firstWhereOrNull((e) =>
e.subject.id == subject.id && e.writeDate.isAfter(DateTime.now()));
bool hasUnder = hasHomework || nearestExam != null;
bool hasUnder = (hasHomework || nearestExam != null) &&
Provider.of<SettingsProvider>(context).qSubjectsSubTiles;
return Padding(
padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero,
@@ -201,7 +219,8 @@ class GradesPageState extends State<GradesPage> {
const SizedBox(
height: 6.0,
),
if (hasHomework)
if (hasHomework &&
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
Container(
decoration: BoxDecoration(
boxShadow: [
@@ -249,7 +268,8 @@ class GradesPageState extends State<GradesPage> {
),
),
),
if (nearestExam != null)
if (nearestExam != null &&
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
Container(
decoration: BoxDecoration(
boxShadow: [
@@ -519,19 +539,10 @@ class GradesPageState extends State<GradesPage> {
child: IconButton(
splashRadius: 24.0,
onPressed: () {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.totalGradeCalculator)) {
PlusLockedFeaturePopup.show(
context: context,
feature: PremiumFeature.gradeCalculation);
return;
}
// SoonAlert.show(context: context);
gradeCalcTotal(context);
showQuickSettings(context);
},
icon: Icon(
FeatherIcons.plus,
FeatherIcons.moreHorizontal,
color: AppColors.of(context).text,
),
),
@@ -627,4 +638,88 @@ class GradesPageState extends State<GradesPage> {
}
});
}
void showQuickSettings(BuildContext context) {
// _sheetController = _scaffoldKey.currentState?.showBottomSheet(
// (context) => RoundedBottomSheet(
// borderRadius: 14.0,
// child: BottomSheetMenu(items: [
// SwitchListTile(
// title: Text('show_lesson_num'.i18n),
// value:
// Provider.of<SettingsProvider>(context).qTimetableLessonNum,
// onChanged: (v) {
// Provider.of<SettingsProvider>(context, listen: false)
// .update(qTimetableLessonNum: v);
// })
// ])),
// backgroundColor: const Color(0x00000000),
// elevation: 12.0,
// );
// _sheetController!.closed.then((value) {
// // Show fab and grades
// if (mounted) {}
// });
showRoundedModalBottomSheet(
context,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
child: BottomSheetMenu(items: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: ListTile(
title: Row(
children: [
const Icon(FeatherIcons.plusCircle),
const SizedBox(
width: 10.0,
),
Text('grade_calc'.i18n),
],
),
onTap: () {
if (!Provider.of<PlusProvider>(context, listen: false)
.hasScope(PremiumScopes.totalGradeCalculator)) {
PlusLockedFeaturePopup.show(
context: context, feature: PremiumFeature.gradeCalculation);
return;
}
// SoonAlert.show(context: context);
gradeCalcTotal(context);
},
),
),
const SizedBox(
height: 10.0,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: SwitchListTile(
title: Row(
children: [
const Icon(Icons.edit_document),
const SizedBox(
width: 10.0,
),
Text('show_exams_homework'.i18n),
],
),
value: Provider.of<SettingsProvider>(context, listen: false)
.qSubjectsSubTiles,
onChanged: (v) {
Provider.of<SettingsProvider>(context, listen: false)
.update(qSubjectsSubTiles: v);
Navigator.of(context, rootNavigator: true).pop();
},
),
),
]),
);
}
}

View File

@@ -27,6 +27,8 @@ extension Localization on String {
"exams": "Exams",
"timetable": "Timetable",
"grades": "Grades",
"show_exams_homework": "Exams and Homework",
"grade_calc": "Grade Calculator",
},
"hu_hu": {
"Grades": "Tantárgyak",
@@ -51,6 +53,8 @@ extension Localization on String {
"exams": "Számonkérések",
"timetable": "Órarend",
"grades": "Jegyek",
"show_exams_homework": "Dolgozatok és házik",
"grade_calc": "Jegy kalkulátor",
},
"de_de": {
"Grades": "Fächer",
@@ -75,6 +79,8 @@ extension Localization on String {
"exams": "Prüfungen",
"timetable": "Stundenplan",
"grades": "Noten",
"show_exams_homework": "Referate und Hausaufgaben",
"grade_calc": "Noten-Rechner",
},
};

View File

@@ -1,5 +1,6 @@
import 'dart:math';
import 'package:animations/animations.dart';
import 'package:flutter/widgets.dart';
import 'package:i18n_extension/i18n_extension.dart';
import 'package:refilc/api/providers/database_provider.dart';
import 'package:refilc/api/providers/update_provider.dart';
@@ -14,6 +15,7 @@ import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc_kreta_api/models/lesson.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
import 'package:refilc_mobile_ui/common/dot.dart';
import 'package:refilc_mobile_ui/common/empty.dart';
import 'package:refilc_mobile_ui/common/profile_image/profile_button.dart';
@@ -69,6 +71,10 @@ class TimetablePage extends StatefulWidget {
class TimetablePageState extends State<TimetablePage>
with TickerProviderStateMixin, WidgetsBindingObserver {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
PersistentBottomSheetController? _sheetController;
late UserProvider user;
late TimetableProvider timetableProvider;
late UpdateProvider updateProvider;
@@ -215,6 +221,7 @@ class TimetablePageState extends State<TimetablePage>
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
return Scaffold(
key: _scaffoldKey,
body: Padding(
padding: const EdgeInsets.only(top: 9.0),
child: RefreshIndicator(
@@ -235,50 +242,50 @@ class TimetablePageState extends State<TimetablePage>
snap: false,
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
actions: [
Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),
child: IconButton(
splashRadius: 24.0,
// tested timetable sync
// onPressed: () async {
// ThirdPartyProvider tpp =
// Provider.of<ThirdPartyProvider>(context,
// listen: false);
// Padding(
// padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),
// child: IconButton(
// splashRadius: 24.0,
// // tested timetable sync
// // onPressed: () async {
// // ThirdPartyProvider tpp =
// // Provider.of<ThirdPartyProvider>(context,
// // listen: false);
// await tpp.pushTimetable(context, _controller);
// },
onPressed: () {
// If timetable empty, show empty
if (_tabController.length == 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text("empty_timetable".i18n),
duration: const Duration(seconds: 2),
));
return;
}
// // await tpp.pushTimetable(context, _controller);
// // },
// onPressed: () {
// // If timetable empty, show empty
// if (_tabController.length == 0) {
// ScaffoldMessenger.of(context).showSnackBar(SnackBar(
// content: Text("empty_timetable".i18n),
// duration: const Duration(seconds: 2),
// ));
// return;
// }
Navigator.of(context, rootNavigator: true)
.push(PageRouteBuilder(
pageBuilder:
(context, animation, secondaryAnimation) =>
FSTimetable(
controller: _controller,
),
))
.then((_) {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp]);
setSystemChrome(context);
});
},
icon: Icon(FeatherIcons.trello,
color: AppColors.of(context).text),
),
),
// Navigator.of(context, rootNavigator: true)
// .push(PageRouteBuilder(
// pageBuilder:
// (context, animation, secondaryAnimation) =>
// FSTimetable(
// controller: _controller,
// ),
// ))
// .then((_) {
// SystemChrome.setPreferredOrientations(
// [DeviceOrientation.portraitUp]);
// setSystemChrome(context);
// });
// },
// icon: Icon(FeatherIcons.trello,
// color: AppColors.of(context).text),
// ),
// ),
Padding(
padding: const EdgeInsets.only(
right: 8.0,
right: 5.0,
bottom: 8.0,
top: 8.0,
),
@@ -293,9 +300,9 @@ class TimetablePageState extends State<TimetablePage>
// await tpp.pushTimetable(context, _controller);
// },
onPressed: () {
showQuickOptions(context);
showQuickSettings(context);
},
icon: Icon(FeatherIcons.menu,
icon: Icon(FeatherIcons.moreHorizontal,
color: AppColors.of(context).text),
),
),
@@ -711,6 +718,9 @@ class TimetablePageState extends State<TimetablePage>
customLessonDesc[
lesson.id] ??
lesson.description,
showSubTiles:
settingsProvider
.qTimetableSubTiles,
),
),
),
@@ -844,35 +854,149 @@ class TimetablePageState extends State<TimetablePage>
);
}
void showQuickOptions(BuildContext context) {
showBottomSheetMenu(
void showQuickSettings(BuildContext context) {
// _sheetController = _scaffoldKey.currentState?.showBottomSheet(
// (context) => RoundedBottomSheet(
// borderRadius: 14.0,
// child: BottomSheetMenu(items: [
// SwitchListTile(
// title: Text('show_lesson_num'.i18n),
// value:
// Provider.of<SettingsProvider>(context).qTimetableLessonNum,
// onChanged: (v) {
// Provider.of<SettingsProvider>(context, listen: false)
// .update(qTimetableLessonNum: v);
// })
// ])),
// backgroundColor: const Color(0x00000000),
// elevation: 12.0,
// );
// _sheetController!.closed.then((value) {
// // Show fab and grades
// if (mounted) {}
// });
showRoundedModalBottomSheet(
context,
items: [
SwitchListTile(
title: Text(
'show_lesson_num'.i18n,
),
value: settingsProvider.qTimetableLessonNum,
onChanged: (v) {
settingsProvider.update(qTimetableLessonNum: v);
setState(() {});
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
child: BottomSheetMenu(items: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: ListTile(
contentPadding: const EdgeInsets.only(left: 16.0, right: 10.0),
title: Row(
children: [
const Icon(FeatherIcons.trello),
const SizedBox(
width: 10.0,
),
Text('full_screen_timetable'.i18n),
],
),
onTap: () {
if (_tabController.length == 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text("empty_timetable".i18n),
duration: const Duration(seconds: 2),
));
return;
}
Navigator.of(context).maybePop();
},
),
SwitchListTile(
title: Text(
'show_exams_and_homework'.i18n,
),
value: settingsProvider.qTimetableSubTiles,
onChanged: (v) {
settingsProvider.update(qTimetableSubTiles: v);
setState(() {});
Navigator.of(context, rootNavigator: true).pop();
Navigator.of(context).maybePop();
},
Navigator.of(context, rootNavigator: true)
.push(PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
FSTimetable(
controller: _controller,
),
))
.then((_) {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp]);
setSystemChrome(context);
});
},
),
),
],
const SizedBox(
height: 10.0,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 16.0, right: 10.0),
title: Row(
children: [
const Icon(Icons.local_cafe_rounded),
const SizedBox(
width: 10.0,
),
Text('show_breaks'.i18n),
],
),
value: Provider.of<SettingsProvider>(context, listen: false)
.showBreaks,
onChanged: (v) {
Provider.of<SettingsProvider>(context, listen: false)
.update(showBreaks: v);
Navigator.of(context, rootNavigator: true).pop();
},
),
),
// SwitchListTile(
// title: Row(
// children: [
// const Icon(FeatherIcons.clock),
// const SizedBox(
// width: 10.0,
// ),
// Text('show_lesson_num'.i18n),
// ],
// ),
// value: Provider.of<SettingsProvider>(context, listen: false)
// .qTimetableLessonNum,
// onChanged: (v) {
// Provider.of<SettingsProvider>(context, listen: false)
// .update(qTimetableLessonNum: v);
// Navigator.of(context, rootNavigator: true).pop();
// },
// ),
const SizedBox(
height: 10.0,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: SwitchListTile(
contentPadding: const EdgeInsets.only(left: 16.0, right: 10.0),
title: Row(
children: [
const Icon(Icons.edit_document),
const SizedBox(
width: 10.0,
),
Text('show_exams_homework'.i18n),
],
),
value: Provider.of<SettingsProvider>(context, listen: false)
.qTimetableSubTiles,
onChanged: (v) {
Provider.of<SettingsProvider>(context, listen: false)
.update(qTimetableSubTiles: v);
Navigator.of(context, rootNavigator: true).pop();
},
),
),
]),
);
}
}

View File

@@ -10,6 +10,9 @@ extension Localization on String {
"error": "Failed to fetch timetable!",
"empty_timetable": "Timetable is empty!",
"break": "Break",
"full_screen_timetable": "Full Screen Timetable",
"show_breaks": "Show Breaks",
"show_exams_homework": "Exams and Homework",
},
"hu_hu": {
"timetable": "Órarend",
@@ -18,6 +21,9 @@ extension Localization on String {
"error": "Nem sikerült lekérni az órarendet!",
"empty_timetable": "Az órarend üres!",
"break": "Szünet",
"full_screen_timetable": "Teljes képernyős órarend",
"show_breaks": "Szünetek megjelenítése",
"show_exams_homework": "Dolgozatok és házik",
},
"de_de": {
"timetable": "Zeitplan",
@@ -26,6 +32,9 @@ extension Localization on String {
"error": "Der Fahrplan konnte nicht abgerufen werden!",
"empty_timetable": "Der Zeitplan ist blank!",
"break": "Pause",
"full_screen_timetable": "Vollbildfahrplan",
"show_breaks": "Pausen anzeigen",
"show_exams_homework": "Referate und Hausaufgaben",
},
};