From 6297b9cc245d6d0947520e8880535d87d5f3d723 Mon Sep 17 00:00:00 2001 From: Kima Date: Sat, 30 Dec 2023 23:47:09 +0100 Subject: [PATCH] almost finished new subjects page --- .../lib/common/average_display.dart | 6 +- .../widgets/grade/grade_subject_tile.dart | 16 ++- .../lib/pages/grades/grades_page.dart | 128 ++++++++++++++++-- .../lib/pages/grades/grades_page.i18n.dart | 18 ++- 4 files changed, 145 insertions(+), 23 deletions(-) diff --git a/filcnaplo_mobile_ui/lib/common/average_display.dart b/filcnaplo_mobile_ui/lib/common/average_display.dart index 15d60c7..8b5396e 100755 --- a/filcnaplo_mobile_ui/lib/common/average_display.dart +++ b/filcnaplo_mobile_ui/lib/common/average_display.dart @@ -23,12 +23,12 @@ class AverageDisplay extends StatelessWidget { return Container( width: border ? 57.0 : 54.0, padding: EdgeInsets.symmetric( - horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)), + horizontal: 6.0 - (border ? 2 : 0), vertical: 5.0 - (border ? 2 : 0)), decoration: BoxDecoration( borderRadius: BorderRadius.circular(45.0), border: border ? Border.fromBorderSide( - BorderSide(color: color.withOpacity(.5), width: 3.0)) + BorderSide(color: color.withOpacity(.5), width: 1.0)) : null, color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null, ), @@ -36,7 +36,7 @@ class AverageDisplay extends StatelessWidget { average == 0.0 ? "-" : averageText, textAlign: TextAlign.center, style: TextStyle( - color: color, fontWeight: FontWeight.w600, fontSize: 14.0), + color: color, fontWeight: FontWeight.w600, fontSize: 15.0), maxLines: 1, ), ); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart index 0b9dda4..5f5cfe2 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_subject_tile.dart @@ -4,6 +4,7 @@ import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_mobile_ui/common/average_display.dart'; +import 'package:filcnaplo_mobile_ui/common/round_border_icon.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -44,9 +45,18 @@ class GradeSubjectTile extends StatelessWidget { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), visualDensity: VisualDensity.compact, onTap: onTap, - leading: Icon( - SubjectIcon.resolveVariant(subject: subject, context: context), - color: textColor.withOpacity(.75)), + leading: RoundBorderIcon( + icon: Icon( + SubjectIcon.resolveVariant( + context: context, + subject: subject, + ), + size: 22.0, + weight: 2.5, + ), + padding: 5.0, + width: 1.0, + ), title: Text( subject.renamedTo ?? subject.name.capital(), maxLines: 2, diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart index 8d516d8..75fca74 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart @@ -3,8 +3,11 @@ import 'dart:math'; import 'package:auto_size_text/auto_size_text.dart'; +import 'package:collection/collection.dart'; import 'package:filcnaplo/api/providers/update_provider.dart'; import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; +import 'package:filcnaplo_kreta_api/models/exam.dart'; +import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; // import 'package:filcnaplo_kreta_api/client/api.dart'; // import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; @@ -13,12 +16,14 @@ import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/models/group_average.dart'; +import 'package:filcnaplo_kreta_api/providers/homework_provider.dart'; import 'package:filcnaplo_mobile_ui/common/average_display.dart'; import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart'; import 'package:filcnaplo_mobile_ui/common/empty.dart'; import 'package:filcnaplo_mobile_ui/common/panel/panel.dart'; import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart'; import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.dart'; +import 'package:filcnaplo_mobile_ui/common/widgets/exam/exam_viewable.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/statistics_tile.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/grade/grade_subject_tile.dart'; import 'package:filcnaplo_mobile_ui/common/trend_display.dart'; @@ -53,6 +58,9 @@ class GradesPageState extends State { late GradeProvider gradeProvider; late UpdateProvider updateProvider; late GradeCalculatorProvider calculatorProvider; + late HomeworkProvider homeworkProvider; + late ExamProvider examProvider; + late String firstName; late Widget yearlyGraph; late Widget gradesCount; @@ -92,6 +100,8 @@ class GradesPageState extends State { Map subjectAvgs = {}; if (!gradeCalcMode) { + var i = 0; + tiles.addAll(subjects.map((subject) { List subjectGrades = getSubjectGrades(subject); @@ -112,15 +122,105 @@ class GradesPageState extends State { if (avg != 0) subjectAvgs[subject] = avg; - return GradeSubjectTile( - subject, - averageBefore: averageBefore, - average: avg, - groupAverage: avgDropValue == 0 ? groupAverage : 0.0, - onTap: () { - GradeSubjectView(subject, groupAverage: groupAverage) - .push(context, root: true); - }, + i++; + + int homeworkCount = homeworkProvider.homework + .where((e) => e.subject.id == subject.id) + .length; + bool hasHomework = homeworkCount > 0; + + Exam? nearestExam = examProvider.exams + .firstWhereOrNull((e) => e.subject.id == subject.id); + + bool hasUnder = hasHomework || nearestExam != null; + + return Padding( + padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero, + child: Column( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: const Radius.circular(16.0), + topRight: const Radius.circular(16.0), + bottomLeft: hasUnder + ? const Radius.circular(8.0) + : const Radius.circular(16.0), + bottomRight: hasUnder + ? const Radius.circular(8.0) + : const Radius.circular(16.0), + ), + color: Theme.of(context).colorScheme.background, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 8.0, horizontal: 6.0), + child: GradeSubjectTile( + subject, + averageBefore: averageBefore, + average: avg, + groupAverage: avgDropValue == 0 ? groupAverage : 0.0, + onTap: () { + GradeSubjectView(subject, groupAverage: groupAverage) + .push(context, root: true); + }, + ), + ), + ), + if (hasUnder) + const SizedBox( + height: 6.0, + ), + if (hasHomework) + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: const Radius.circular(8.0), + topRight: const Radius.circular(8.0), + bottomLeft: nearestExam != null + ? const Radius.circular(8.0) + : const Radius.circular(16.0), + bottomRight: nearestExam != null + ? const Radius.circular(8.0) + : const Radius.circular(16.0), + ), + color: Theme.of(context).colorScheme.background, + ), + child: Padding( + padding: const EdgeInsets.only( + top: 8.0, + bottom: 8.0, + left: 15.0, + right: 8.0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('you_have_hw'.i18n.fill([homeworkCount])), + // const Icon( + // FeatherIcons.chevronRight, + // grade: 0.5, + // size: 20.0, + // ) + ], + ), + ), + ), + if (nearestExam != null) + Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(8.0), + topRight: Radius.circular(8.0), + bottomLeft: Radius.circular(16.0), + bottomRight: Radius.circular(16.0), + ), + color: Theme.of(context).colorScheme.background, + ), + child: ExamViewable(nearestExam), + ), + ], + ), ); })); } else { @@ -165,8 +265,8 @@ class GradesPageState extends State { )), ); - tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0))); - tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0))); + // tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0))); + // tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0))); } tiles.add(Padding( padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0), @@ -193,6 +293,9 @@ class GradesPageState extends State { : 0.0; if (subjectAvg > 0 && !gradeCalcMode) { + tiles.add( + PanelTitle(title: Text("data".i18n)), + ); tiles.add(Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -248,6 +351,9 @@ class GradesPageState extends State { gradeProvider = Provider.of(context); updateProvider = Provider.of(context); calculatorProvider = Provider.of(context); + homeworkProvider = Provider.of(context); + examProvider = Provider.of(context); + context.watch(); List nameParts = user.displayName?.split(" ") ?? ["?"]; diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.i18n.dart b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.i18n.dart index 56db6ff..d0b5d64 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.i18n.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.i18n.dart @@ -4,9 +4,9 @@ extension Localization on String { static final _t = Translations.byLocale("hu_hu") + { "en_en": { - "Grades": "Grades", + "Grades": "Subjects", "Ghost Grades": "Grades", - "Subjects": "Subjects", + "Subjects": "Your Subjects", "Subjects_changes": "Subject Differences", "empty": "You don't have any subjects.", "annual_average": "Annual average", @@ -18,11 +18,13 @@ extension Localization on String { "classavg": "Class Average", "fail_warning": "Failure warning", "fail_warning_description": "You are failing %d subject(s)", + "data": "Data", + "you_have_hw": "You have %s homework(s) to do", }, "hu_hu": { - "Grades": "Jegyek", + "Grades": "Tantárgyak", "Ghost Grades": "Szellem jegyek", - "Subjects": "Tantárgyak", + "Subjects": "Tantárgyaid", "Subjects_changes": "Tantárgyi változások", "empty": "Még nincs egy tárgyad sem.", "annual_average": "Éves átlag", @@ -34,11 +36,13 @@ extension Localization on String { "classavg": "Osztályátlag", "fail_warning": "Bukás figyelmeztető", "fail_warning_description": "Bukásra állsz %d tantárgyból", + "data": "Adatok", + "you_have_hw": "%s házi feladat vár rád", }, "de_de": { - "Grades": "Noten", + "Grades": "Fächer", "Ghost Grades": "Geist Noten", - "Subjects": "Fächer", + "Subjects": "Ihre Themen", "Subjects_changes": "Betreff Änderungen", "empty": "Sie haben keine Fächer.", "annual_average": "Jahresdurchschnitt", @@ -50,6 +54,8 @@ extension Localization on String { "classavg": "Klassendurchschnitt", "fail_warning": "Ausfallwarnung", "fail_warning_description": "Sie werden in %d des Fachs durchfallen", + "data": "Daten", + "you_have_hw": "Du hast %s Hausaufgaben", }, };