diff --git a/filcnaplo/lib/helpers/subject.dart b/filcnaplo/lib/helpers/subject.dart index 3cdb746..e571975 100644 --- a/filcnaplo/lib/helpers/subject.dart +++ b/filcnaplo/lib/helpers/subject.dart @@ -22,7 +22,8 @@ class SubjectIconData { }); } -SubjectIconVariants createIcon({required IconData material, required IconData cupertino}) { +SubjectIconVariants createIcon( + {required IconData material, required IconData cupertino}) { return { IconPack.material: material, IconPack.cupertino: cupertino, @@ -30,88 +31,224 @@ SubjectIconVariants createIcon({required IconData material, required IconData cu } class SubjectIcon { - static String resolveName({Subject? subject, String? subjectName}) => _resolve(subject: subject, subjectName: subjectName).name; - static IconData resolveVariant({Subject? subject, String? subjectName, required BuildContext context}) => - _resolve(subject: subject, subjectName: subjectName).data[Provider.of(context, listen: false).iconPack]!; + static String resolveName({GradeSubject? subject, String? subjectName}) => + _resolve(subject: subject, subjectName: subjectName).name; + static IconData resolveVariant( + {GradeSubject? subject, + String? subjectName, + required BuildContext context}) => + _resolve(subject: subject, subjectName: subjectName).data[ + Provider.of(context, listen: false).iconPack]!; - static SubjectIconData _resolve({Subject? subject, String? subjectName}) { + static SubjectIconData _resolve( + {GradeSubject? subject, String? subjectName}) { assert(!(subject == null && subjectName == null)); - String name = (subject?.name ?? subjectName ?? "").toLowerCase().specialChars().trim(); - String category = subject?.category.description.toLowerCase().specialChars() ?? ""; + String name = (subject?.name ?? subjectName ?? "") + .toLowerCase() + .specialChars() + .trim(); + String category = + subject?.category.description.toLowerCase().specialChars() ?? ""; // todo: check for categories if (RegExp("mate(k|matika)").hasMatch(name) || category == "matematika") { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.function, material: Icons.calculate_outlined), name: "function"); - } else if (RegExp("magyar nyelv|nyelvtan").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.textformat_alt, material: Icons.spellcheck_outlined), name: "textformat.alt"); - } else if (RegExp("irodalom").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.book, material: Icons.menu_book_outlined), name: "book"); - } else if (RegExp("tor(i|tenelem)").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.compass, material: Icons.hourglass_empty_outlined), name: "safari"); - } else if (RegExp("foldrajz").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.map, material: Icons.public_outlined), name: "map"); - } else if (RegExp("rajz|muvtori|muveszet|vizualis").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.paintbrush, material: Icons.palette_outlined), name: "paintbrush"); - } else if (RegExp("fizika").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.lightbulb, material: Icons.emoji_objects_outlined), name: "lightbulb"); - } else if (RegExp("^enek|zene|szolfezs|zongora|korus").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.music_note, material: Icons.music_note_outlined), name: "music.note"); - } else if (RegExp("^tes(i|tneveles)|sport").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.sportscourt, material: Icons.sports_soccer_outlined), name: "sportscourt"); - } else if (RegExp("kemia").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.lab_flask, material: Icons.science_outlined), name: "testtube.2"); - } else if (RegExp("biologia").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.paw, material: Icons.pets_outlined), name: "pawprint"); - } else if (RegExp("kornyezet|termeszet ?(tudomany|ismeret)|hon( es nep)?ismeret").hasMatch(name)) { return SubjectIconData( - data: createIcon(cupertino: CupertinoIcons.arrow_3_trianglepath, material: Icons.eco_outlined), name: "arrow.3.trianglepath"); + data: createIcon( + cupertino: CupertinoIcons.function, + material: Icons.calculate_outlined), + name: "function"); + } else if (RegExp("magyar nyelv|nyelvtan").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.textformat_alt, + material: Icons.spellcheck_outlined), + name: "textformat.alt"); + } else if (RegExp("irodalom").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.book, + material: Icons.menu_book_outlined), + name: "book"); + } else if (RegExp("tor(i|tenelem)").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.compass, + material: Icons.hourglass_empty_outlined), + name: "safari"); + } else if (RegExp("foldrajz").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.map, material: Icons.public_outlined), + name: "map"); + } else if (RegExp("rajz|muvtori|muveszet|vizualis").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.paintbrush, + material: Icons.palette_outlined), + name: "paintbrush"); + } else if (RegExp("fizika").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.lightbulb, + material: Icons.emoji_objects_outlined), + name: "lightbulb"); + } else if (RegExp("^enek|zene|szolfezs|zongora|korus").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.music_note, + material: Icons.music_note_outlined), + name: "music.note"); + } else if (RegExp("^tes(i|tneveles)|sport").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.sportscourt, + material: Icons.sports_soccer_outlined), + name: "sportscourt"); + } else if (RegExp("kemia").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.lab_flask, + material: Icons.science_outlined), + name: "testtube.2"); + } else if (RegExp("biologia").hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.paw, material: Icons.pets_outlined), + name: "pawprint"); + } else if (RegExp( + "kornyezet|termeszet ?(tudomany|ismeret)|hon( es nep)?ismeret") + .hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.arrow_3_trianglepath, + material: Icons.eco_outlined), + name: "arrow.3.trianglepath"); } else if (RegExp("(hit|erkolcs)tan|vallas|etika").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.heart, material: Icons.favorite_border_outlined), name: "heart"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.heart, + material: Icons.favorite_border_outlined), + name: "heart"); } else if (RegExp("penzugy").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.money_dollar, material: Icons.savings_outlined), name: "dollarsign"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.money_dollar, + material: Icons.savings_outlined), + name: "dollarsign"); } else if (RegExp("informatika|szoftver|iroda|digitalis").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.device_laptop, material: Icons.computer_outlined), name: "laptopcomputer"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.device_laptop, + material: Icons.computer_outlined), + name: "laptopcomputer"); } else if (RegExp("prog").hasMatch(name)) { return SubjectIconData( - data: createIcon(cupertino: CupertinoIcons.chevron_left_slash_chevron_right, material: Icons.code_outlined), + data: createIcon( + cupertino: CupertinoIcons.chevron_left_slash_chevron_right, + material: Icons.code_outlined), name: "chevron.left.forwardslash.chevron.right"); } else if (RegExp("halozat").hasMatch(name)) { return SubjectIconData( - data: createIcon(cupertino: CupertinoIcons.antenna_radiowaves_left_right, material: Icons.wifi_tethering_outlined), + data: createIcon( + cupertino: CupertinoIcons.antenna_radiowaves_left_right, + material: Icons.wifi_tethering_outlined), name: "antenna.radiowaves.left.and.right"); } else if (RegExp("szinhaz").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.hifispeaker, material: Icons.theater_comedy_outlined), name: "hifispeaker"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.hifispeaker, + material: Icons.theater_comedy_outlined), + name: "hifispeaker"); } else if (RegExp("film|media").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.film, material: Icons.theaters_outlined), name: "film"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.film, + material: Icons.theaters_outlined), + name: "film"); } else if (RegExp("elektro(tech)?nika").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.bolt, material: Icons.electrical_services_outlined), name: "bolt"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.bolt, + material: Icons.electrical_services_outlined), + name: "bolt"); } else if (RegExp("gepesz|mernok|ipar").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.wrench, material: Icons.precision_manufacturing_outlined), name: "wrench"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.wrench, + material: Icons.precision_manufacturing_outlined), + name: "wrench"); } else if (RegExp("technika").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.hammer, material: Icons.build_outlined), name: "hammer"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.hammer, material: Icons.build_outlined), + name: "hammer"); } else if (RegExp("tanc").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.music_mic, material: Icons.speaker_outlined), name: "music.mic"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.music_mic, + material: Icons.speaker_outlined), + name: "music.mic"); } else if (RegExp("filozofia").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.bubble_left, material: Icons.psychology_outlined), name: "bubble.left"); - } else if (RegExp("osztaly(fonoki|kozosseg)").hasMatch(name) || name == "ofo") { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.group, material: Icons.groups_outlined), name: "person.3"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.bubble_left, + material: Icons.psychology_outlined), + name: "bubble.left"); + } else if (RegExp("osztaly(fonoki|kozosseg)").hasMatch(name) || + name == "ofo") { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.group, material: Icons.groups_outlined), + name: "person.3"); } else if (RegExp("gazdasag").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.chart_pie, material: Icons.account_balance_outlined), name: "chart.pie"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.chart_pie, + material: Icons.account_balance_outlined), + name: "chart.pie"); } else if (RegExp("szorgalom").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.checkmark_seal, material: Icons.verified_outlined), name: "checkmark.seal"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.checkmark_seal, + material: Icons.verified_outlined), + name: "checkmark.seal"); } else if (RegExp("magatartas").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.smiley, material: Icons.emoji_people_outlined), name: "face.smiling"); - } else if (RegExp("angol|nemet|francia|olasz|orosz|spanyol|latin|kinai|nyelv").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.globe, material: Icons.translate_outlined), name: "globe"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.smiley, + material: Icons.emoji_people_outlined), + name: "face.smiling"); + } else if (RegExp( + "angol|nemet|francia|olasz|orosz|spanyol|latin|kinai|nyelv") + .hasMatch(name)) { + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.globe, + material: Icons.translate_outlined), + name: "globe"); } else if (RegExp("linux").hasMatch(name)) { - return SubjectIconData(data: createIcon(material: FilcIcons.linux, cupertino: FilcIcons.linux)); + return SubjectIconData( + data: createIcon( + material: FilcIcons.linux, cupertino: FilcIcons.linux)); } else if (RegExp("adatbazis").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.table_badge_more, material: Icons.table_chart), name: "table.badge.more"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.table_badge_more, + material: Icons.table_chart), + name: "table.badge.more"); } else if (RegExp("asztali alkalmazasok").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.macwindow, material: Icons.desktop_windows_outlined), name: "macwindow"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.macwindow, + material: Icons.desktop_windows_outlined), + name: "macwindow"); } else if (RegExp("projekt").hasMatch(name)) { - return SubjectIconData(data: createIcon(cupertino: CupertinoIcons.person_3_fill, material: Icons.groups_3), name: "person.3.fill"); + return SubjectIconData( + data: createIcon( + cupertino: CupertinoIcons.person_3_fill, + material: Icons.groups_3), + name: "person.3.fill"); } return SubjectIconData(); @@ -119,10 +256,13 @@ class SubjectIcon { } class ShortSubject { - static String resolve({Subject? subject, String? subjectName}) { + static String resolve({GradeSubject? subject, String? subjectName}) { assert(!(subject == null && subjectName == null)); - String name = (subject?.name ?? subjectName ?? "").toLowerCase().specialChars().trim(); + String name = (subject?.name ?? subjectName ?? "") + .toLowerCase() + .specialChars() + .trim(); // String category = subject?.category.description.toLowerCase().specialChars() ?? ""; if (RegExp("magyar irodalom").hasMatch(name)) { @@ -137,7 +277,9 @@ class ShortSubject { return "Tesi"; } else if (RegExp("tortenelem").hasMatch(name)) { return "Töri"; - } else if (RegExp("(angol|nemet|francia|olasz|orosz|spanyol|latin|kinai) nyelv").hasMatch(name)) { + } else if (RegExp( + "(angol|nemet|francia|olasz|orosz|spanyol|latin|kinai) nyelv") + .hasMatch(name)) { return (subject?.name ?? subjectName ?? "?").replaceAll(" nyelv", ""); } else if (RegExp("informatika").hasMatch(name)) { return "Infó"; diff --git a/filcnaplo/lib/models/subject_lesson_count.dart b/filcnaplo/lib/models/subject_lesson_count.dart index 8a8adde..70d733e 100644 --- a/filcnaplo/lib/models/subject_lesson_count.dart +++ b/filcnaplo/lib/models/subject_lesson_count.dart @@ -5,17 +5,21 @@ enum SubjectLessonCountUpdateState { ready, updating } class SubjectLessonCount { DateTime lastUpdated; - Map subjects; + Map subjects; SubjectLessonCountUpdateState state; - SubjectLessonCount({required this.lastUpdated, required this.subjects, this.state = SubjectLessonCountUpdateState.ready}); + SubjectLessonCount( + {required this.lastUpdated, + required this.subjects, + this.state = SubjectLessonCountUpdateState.ready}); factory SubjectLessonCount.fromMap(Map json) { return SubjectLessonCount( - lastUpdated: DateTime.fromMillisecondsSinceEpoch(json["last_updated"] ?? 0), + lastUpdated: + DateTime.fromMillisecondsSinceEpoch(json["last_updated"] ?? 0), subjects: ((json["subjects"] as Map?) ?? {}).map( (key, value) => MapEntry( - Subject(id: key, name: "", category: Category.fromJson({})), + GradeSubject(id: key, name: "", category: Category.fromJson({})), value, ), ), diff --git a/filcnaplo_desktop_ui/lib/pages/absences/absences_page.dart b/filcnaplo_desktop_ui/lib/pages/absences/absences_page.dart index f9270b5..5f25081 100644 --- a/filcnaplo_desktop_ui/lib/pages/absences/absences_page.dart +++ b/filcnaplo_desktop_ui/lib/pages/absences/absences_page.dart @@ -31,7 +31,7 @@ import 'absences_page.i18n.dart'; enum AbsenceFilter { absences, delays, misses } class SubjectAbsence { - Subject subject; + GradeSubject subject; List absences; double percentage; @@ -56,7 +56,7 @@ class _AbsencesPageState extends State late String firstName; late TabController _tabController; late List absences = []; - final Map _lessonCount = {}; + final Map _lessonCount = {}; @override void initState() { @@ -87,7 +87,7 @@ class _AbsencesPageState extends State } void buildSubjectAbsences() { - Map _absences = {}; + Map _absences = {}; for (final absence in absenceProvider.absences) { if (absence.delay != 0) continue; diff --git a/filcnaplo_desktop_ui/lib/pages/grades/grade_subject_view.dart b/filcnaplo_desktop_ui/lib/pages/grades/grade_subject_view.dart index 95571f1..1b30577 100644 --- a/filcnaplo_desktop_ui/lib/pages/grades/grade_subject_view.dart +++ b/filcnaplo_desktop_ui/lib/pages/grades/grade_subject_view.dart @@ -32,7 +32,7 @@ class GradeSubjectView extends StatefulWidget { const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0}) : super(key: key); - final Subject subject; + final GradeSubject subject; final double groupAverage; void push(BuildContext context, {bool root = false}) { @@ -62,7 +62,7 @@ class _GradeSubjectViewState extends State { bool gradeCalcMode = false; - List getSubjectGrades(Subject subject) => !gradeCalcMode + List getSubjectGrades(GradeSubject subject) => !gradeCalcMode ? gradeProvider.grades.where((e) => e.subject == subject).toList() : calculatorProvider.grades.where((e) => e.subject == subject).toList(); diff --git a/filcnaplo_desktop_ui/lib/pages/grades/grades_page.dart b/filcnaplo_desktop_ui/lib/pages/grades/grades_page.dart index 0a2099b..06bbcd5 100644 --- a/filcnaplo_desktop_ui/lib/pages/grades/grades_page.dart +++ b/filcnaplo_desktop_ui/lib/pages/grades/grades_page.dart @@ -41,7 +41,7 @@ class _GradesPageState extends State { int avgDropValue = 0; - List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider + List getSubjectGrades(GradeSubject subject, {int days = 0}) => gradeProvider .grades .where((e) => e.subject == subject && @@ -51,14 +51,14 @@ class _GradesPageState extends State { .toList(); void generateTiles() { - List subjects = gradeProvider.grades + List subjects = gradeProvider.grades .map((e) => e.subject) .toSet() .toList() ..sort((a, b) => a.name.compareTo(b.name)); List tiles = []; - Map subjectAvgs = {}; + Map subjectAvgs = {}; tiles.addAll(subjects.map((subject) { List subjectGrades = getSubjectGrades(subject); diff --git a/filcnaplo_kreta_api/lib/models/absence.dart b/filcnaplo_kreta_api/lib/models/absence.dart index 9997351..23d4db3 100644 --- a/filcnaplo_kreta_api/lib/models/absence.dart +++ b/filcnaplo_kreta_api/lib/models/absence.dart @@ -13,7 +13,7 @@ class Absence { Category? justification; Category? type; Category? mode; - Subject subject; + GradeSubject subject; DateTime lessonStart; DateTime lessonEnd; int? lessonIndex; @@ -83,7 +83,7 @@ class Absence { : null, type: json["Tipus"] != null ? Category.fromJson(json["Tipus"]) : null, mode: json["Mod"] != null ? Category.fromJson(json["Mod"]) : null, - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), lessonStart: lessonStart, lessonEnd: lessonEnd, lessonIndex: lessonIndex, diff --git a/filcnaplo_kreta_api/lib/models/exam.dart b/filcnaplo_kreta_api/lib/models/exam.dart index 31741b0..94055fa 100644 --- a/filcnaplo_kreta_api/lib/models/exam.dart +++ b/filcnaplo_kreta_api/lib/models/exam.dart @@ -10,7 +10,7 @@ class Exam { Category? mode; // int? subjectIndex; // String subjectName; - Subject subject; + GradeSubject subject; Teacher teacher; String description; String group; @@ -42,7 +42,7 @@ class Exam { mode: json["Modja"] != null ? Category.fromJson(json["Modja"]) : null, // subjectIndex: json["OrarendiOraOraszama"], // subjectName: json["TantargyNeve"] ?? "", - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), teacher: Teacher.fromString((json["RogzitoTanarNeve"] ?? "").trim()), description: (json["Temaja"] ?? "").trim(), group: json["OsztalyCsoport"] != null diff --git a/filcnaplo_kreta_api/lib/models/grade.dart b/filcnaplo_kreta_api/lib/models/grade.dart index 80c7db7..35d6709 100644 --- a/filcnaplo_kreta_api/lib/models/grade.dart +++ b/filcnaplo_kreta_api/lib/models/grade.dart @@ -12,7 +12,7 @@ class Grade { String description; GradeType type; String groupId; - Subject subject; + GradeSubject subject; Category? gradeType; Category mode; DateTime writeDate; @@ -57,7 +57,7 @@ class Grade { ? Category.getGradeType(json["Tipus"]["Nev"]) : GradeType.unknown, groupId: (json["OsztalyCsoport"] ?? {})["Uid"] ?? "", - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), gradeType: json["ErtekFajta"] != null ? Category.fromJson(json["ErtekFajta"]) : null, diff --git a/filcnaplo_kreta_api/lib/models/group_average.dart b/filcnaplo_kreta_api/lib/models/group_average.dart index e95f730..7441966 100644 --- a/filcnaplo_kreta_api/lib/models/group_average.dart +++ b/filcnaplo_kreta_api/lib/models/group_average.dart @@ -3,7 +3,7 @@ import 'package:filcnaplo_kreta_api/models/subject.dart'; class GroupAverage { String uid; double average; - Subject subject; + GradeSubject subject; Map json; GroupAverage({required this.uid, required this.average, required this.subject, this.json = const {}}); @@ -12,7 +12,7 @@ class GroupAverage { return GroupAverage( uid: json["Uid"] ?? "", average: json["OsztalyCsoportAtlag"] ?? 0, - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), json: json, ); } diff --git a/filcnaplo_kreta_api/lib/models/homework.dart b/filcnaplo_kreta_api/lib/models/homework.dart index bd4ab39..88102ec 100644 --- a/filcnaplo_kreta_api/lib/models/homework.dart +++ b/filcnaplo_kreta_api/lib/models/homework.dart @@ -12,7 +12,7 @@ class Homework { bool homeworkEnabled; Teacher teacher; String content; - Subject subject; + GradeSubject subject; String group; List attachments; String id; @@ -48,7 +48,7 @@ class Homework { homeworkEnabled: json["IsTanuloHaziFeladatEnabled"] ?? false, teacher: Teacher.fromString((json["RogzitoTanarNeve"] ?? "").trim()), content: (json["Szoveg"] ?? "").trim(), - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), group: json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] ?? "" : "", diff --git a/filcnaplo_kreta_api/lib/models/lesson.dart b/filcnaplo_kreta_api/lib/models/lesson.dart index afa7d7c..7cd0008 100644 --- a/filcnaplo_kreta_api/lib/models/lesson.dart +++ b/filcnaplo_kreta_api/lib/models/lesson.dart @@ -6,7 +6,7 @@ class Lesson { Map? json; Category? status; DateTime date; - Subject subject; + GradeSubject subject; String lessonIndex; int? lessonYearIndex; Teacher? substituteTeacher; @@ -68,7 +68,7 @@ class Lesson { date: json["Datum"] != null ? DateTime.parse(json["Datum"]).toLocal() : DateTime(0), - subject: Subject.fromJson(json["Tantargy"] ?? {}), + subject: GradeSubject.fromJson(json["Tantargy"] ?? {}), lessonIndex: json["Oraszam"] != null ? json["Oraszam"].toString() : "+", lessonYearIndex: json["OraEvesSorszama"], substituteTeacher: json["HelyettesTanarNeve"] != null diff --git a/filcnaplo_kreta_api/lib/models/subject.dart b/filcnaplo_kreta_api/lib/models/subject.dart index ec36d32..1ebd8ec 100644 --- a/filcnaplo_kreta_api/lib/models/subject.dart +++ b/filcnaplo_kreta_api/lib/models/subject.dart @@ -1,6 +1,6 @@ import 'category.dart'; -class Subject { +class GradeSubject { String id; Category category; String name; @@ -8,11 +8,16 @@ class Subject { bool get isRenamed => renamedTo != null; - Subject({required this.id, required this.category, required this.name, this.renamedTo}); + GradeSubject({ + required this.id, + required this.category, + required this.name, + this.renamedTo, + }); - factory Subject.fromJson(Map json) { + factory GradeSubject.fromJson(Map json) { final id = json["Uid"] ?? ""; - return Subject( + return GradeSubject( id: id, category: Category.fromJson(json["Kategoria"] ?? {}), name: (json["Nev"] ?? "").trim(), @@ -21,7 +26,7 @@ class Subject { @override bool operator ==(other) { - if (other is! Subject) return false; + if (other is! GradeSubject) return false; return id == other.id; } diff --git a/filcnaplo_kreta_api/lib/providers/subject_provider.dart b/filcnaplo_kreta_api/lib/providers/subject_provider.dart new file mode 100644 index 0000000..7a9ac4b --- /dev/null +++ b/filcnaplo_kreta_api/lib/providers/subject_provider.dart @@ -0,0 +1,165 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/api/providers/database_provider.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo/models/user.dart'; +import 'package:filcnaplo_kreta_api/client/api.dart'; +import 'package:filcnaplo_kreta_api/client/client.dart'; +import 'package:filcnaplo_kreta_api/models/grade.dart'; +import 'package:filcnaplo_kreta_api/models/group_average.dart'; +import 'package:filcnaplo_kreta_api/providers/grade_provider.i18n.dart'; +import 'package:flutter/material.dart'; + +class SubjectProvider with ChangeNotifier { + // Private + late List _grades; + late DateTime _lastSeen; + late String _groups; + List _groupAvg = []; + late final SettingsProvider _settings; + late final UserProvider _user; + late final DatabaseProvider _database; + late final KretaClient _kreta; + + // Public + List get grades => _grades; + DateTime get lastSeenDate => + _settings.gradeOpeningFun ? _lastSeen : DateTime(3000); + String get groups => _groups; + List get groupAverages => _groupAvg; + + SubjectProvider({ + List initialGrades = const [], + required SettingsProvider settings, + required UserProvider user, + required DatabaseProvider database, + required KretaClient kreta, + }) { + _settings = settings; + _user = user; + _database = database; + _kreta = kreta; + + _grades = List.castFrom(initialGrades); + _lastSeen = DateTime.now(); + + if (_grades.isEmpty) restore(); + } + + Future seenAll() async { + String? userId = _user.id; + if (userId != null) { + final userStore = _database.userStore; + userStore.storeLastSeenGrade(DateTime.now(), userId: userId); + _lastSeen = DateTime.now(); + } + } + + Future restore() async { + String? userId = _user.id; + + // Load grades from the database + if (userId != null) { + final userQuery = _database.userQuery; + + _grades = await userQuery.getGrades(userId: userId); + await convertBySettings(); + _groupAvg = await userQuery.getGroupAverages(userId: userId); + notifyListeners(); + DateTime lastSeenDB = await userQuery.lastSeenGrade(userId: userId); + if (lastSeenDB.millisecondsSinceEpoch == 0 || + lastSeenDB.year == 0 || + !_settings.gradeOpeningFun) { + _lastSeen = DateTime.now(); + await seenAll(); + } else { + _lastSeen = lastSeenDB; + } + notifyListeners(); + } + } + + // good student mode, renamed subjects + Future convertBySettings() async { + Map renamedSubjects = _settings.renamedSubjectsEnabled + ? await _database.userQuery.renamedSubjects(userId: _user.user!.id) + : {}; + Map renamedTeachers = _settings.renamedTeachersEnabled + ? await _database.userQuery.renamedTeachers(userId: _user.user!.id) + : {}; + + for (Grade grade in _grades) { + grade.subject.renamedTo = + renamedSubjects.isNotEmpty ? renamedSubjects[grade.subject.id] : null; + grade.teacher.renamedTo = + renamedTeachers.isNotEmpty ? renamedTeachers[grade.teacher.id] : null; + + grade.value.value = + _settings.goodStudent ? 5 : grade.json!["SzamErtek"] ?? 0; + grade.value.valueName = _settings.goodStudent + ? "Jeles".i18n + : '${grade.json!["SzovegesErtek"]}' + .replaceAll(RegExp(r'[(]+[12345]?[)]'), '') + .i18n; + grade.value.shortName = _settings.goodStudent + ? "Jeles".i18n + : '${grade.json!["SzovegesErtekelesRovidNev"]}' != "null" && + '${grade.json!["SzovegesErtekelesRovidNev"]}' != "-" && + '${grade.json!["SzovegesErtekelesRovidNev"]}' + .replaceAll(RegExp(r'[0123456789]+[%]?'), '') != + "" + ? '${grade.json!["SzovegesErtekelesRovidNev"]}'.i18n + : grade.value.valueName; + } + + notifyListeners(); + } + + // Fetches Grades from the Kreta API then stores them in the database + Future fetch() async { + User? user = _user.user; + if (user == null) throw "Cannot fetch Grades for User null"; + String iss = user.instituteCode; + + List? gradesJson = await _kreta.getAPI(KretaAPI.grades(iss)); + if (gradesJson == null) throw "Cannot fetch Grades for User ${user.id}"; + List grades = gradesJson.map((e) => Grade.fromJson(e)).toList(); + + if (grades.isNotEmpty || _grades.isNotEmpty) await store(grades); + + List? groupsJson = await _kreta.getAPI(KretaAPI.groups(iss)); + if (groupsJson == null || groupsJson.isEmpty) { + throw "Cannot fetch Groups for User ${user.id}"; + } + _groups = (groupsJson[0]["OktatasNevelesiFeladat"] ?? {})["Uid"] ?? ""; + + List? groupAvgJson = + await _kreta.getAPI(KretaAPI.groupAverages(iss, _groups)); + if (groupAvgJson == null) { + throw "Cannot fetch Class Averages for User ${user.id}"; + } + final groupAvgs = + groupAvgJson.map((e) => GroupAverage.fromJson(e)).toList(); + await storeGroupAvg(groupAvgs); + } + + // Stores Grades in the database + Future store(List grades) async { + User? user = _user.user; + if (user == null) throw "Cannot store Grades for User null"; + String userId = user.id; + + await _database.userStore.storeGrades(grades, userId: userId); + _grades = grades; + await convertBySettings(); + } + + Future storeGroupAvg(List groupAvgs) async { + _groupAvg = groupAvgs; + + User? user = _user.user; + if (user == null) throw "Cannot store Grades for User null"; + String userId = user.id; + await _database.userStore.storeGroupAverages(groupAvgs, userId: userId); + notifyListeners(); + } +} diff --git a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart index a6dec8e..b442c38 100644 --- a/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart +++ b/filcnaplo_mobile_ui/lib/common/personality_card/personality_card.dart @@ -35,12 +35,12 @@ class _PersonalityCardState extends State { late SettingsProvider settings; late List subjectAvgsList = []; - late Map subjectAvgs = {}; + late Map subjectAvgs = {}; late double subjectAvg; late List classWorkGrades; late Map mostCommonGrade; late List absences = []; - final Map _lessonCount = {}; + final Map _lessonCount = {}; late int totalDelays; late int unexcusedAbsences; @@ -48,14 +48,15 @@ class _PersonalityCardState extends State { bool hold = false; - List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider - .grades - .where((e) => - e.subject == subject && - e.type == GradeType.midYear && - (days == 0 || - e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) - .toList(); + List getSubjectGrades(GradeSubject subject, {int days = 0}) => + gradeProvider.grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date + .isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); @override void initState() { @@ -89,13 +90,13 @@ class _PersonalityCardState extends State { } void getGrades() { - List subjects = gradeProvider.grades + List subjects = gradeProvider.grades .map((e) => e.subject) .toSet() .toList() ..sort((a, b) => a.name.compareTo(b.name)); - for (Subject subject in subjects) { + for (GradeSubject subject in subjects) { List subjectGrades = getSubjectGrades(subject); double avg = AverageHelper.averageEvals(subjectGrades); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/absence/absence_subject_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/absence/absence_subject_tile.dart index c8fc05d..adf5e5f 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/absence/absence_subject_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/absence/absence_subject_tile.dart @@ -8,10 +8,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class AbsenceSubjectTile extends StatelessWidget { - const AbsenceSubjectTile(this.subject, {Key? key, this.percentage = 0.0, this.excused = 0, this.unexcused = 0, this.pending = 0, this.onTap}) + const AbsenceSubjectTile(this.subject, + {Key? key, + this.percentage = 0.0, + this.excused = 0, + this.unexcused = 0, + this.pending = 0, + this.onTap}) : super(key: key); - final Subject subject; + final GradeSubject subject; final void Function()? onTap; final double percentage; @@ -31,12 +37,20 @@ class AbsenceSubjectTile extends StatelessWidget { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)), visualDensity: VisualDensity.compact, onTap: onTap, - leading: Icon(SubjectIcon.resolveVariant(subject: subject, context: context), size: 32.0), + leading: Icon( + SubjectIcon.resolveVariant(subject: subject, context: context), + size: 32.0), title: Text( subject.renamedTo ?? subject.name.capital(), maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w600, fontSize: 15.0, fontStyle: subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null), + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 15.0, + fontStyle: + subject.isRenamed && settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null), ), subtitle: AbsenceDisplay(excused, unexcused, pending), trailing: Row( @@ -47,7 +61,10 @@ class AbsenceSubjectTile extends StatelessWidget { Stack( alignment: Alignment.centerRight, children: [ - const Opacity(child: Text("100%", style: TextStyle(fontFamily: "monospace")), opacity: 0), + const Opacity( + child: Text("100%", + style: TextStyle(fontFamily: "monospace")), + opacity: 0), Text( percentage.round().toString() + "%", style: TextStyle( 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 35e6509..00e87d0 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 @@ -16,7 +16,7 @@ class GradeSubjectTile extends StatelessWidget { this.averageBefore = 0.0}) : super(key: key); - final Subject subject; + final GradeSubject subject; final void Function()? onTap; final double average; final double groupAverage; @@ -56,7 +56,10 @@ class GradeSubjectTile extends StatelessWidget { fontWeight: FontWeight.w600, fontSize: 14.0, color: textColor, - fontStyle: settingsProvider.renamedSubjectsItalics && subject.isRenamed ? FontStyle.italic : null), + fontStyle: + settingsProvider.renamedSubjectsItalics && subject.isRenamed + ? FontStyle.italic + : null), ), trailing: Row( mainAxisSize: MainAxisSize.min, diff --git a/filcnaplo_mobile_ui/lib/pages/absences/absence_subject_view.dart b/filcnaplo_mobile_ui/lib/pages/absences/absence_subject_view.dart index dc184e7..c0a0a95 100755 --- a/filcnaplo_mobile_ui/lib/pages/absences/absence_subject_view.dart +++ b/filcnaplo_mobile_ui/lib/pages/absences/absence_subject_view.dart @@ -22,10 +22,10 @@ class AbsenceSubjectView extends StatelessWidget { const AbsenceSubjectView(this.subject, {Key? key, this.absences = const []}) : super(key: key); - final Subject subject; + final GradeSubject subject; final List absences; - static void show(Subject subject, List absences, + static void show(GradeSubject subject, List absences, {required BuildContext context}) { Navigator.of(context, rootNavigator: true) .push(CupertinoPageRoute( diff --git a/filcnaplo_mobile_ui/lib/pages/absences/absences_page.dart b/filcnaplo_mobile_ui/lib/pages/absences/absences_page.dart index dc2218d..81e8b5b 100755 --- a/filcnaplo_mobile_ui/lib/pages/absences/absences_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/absences/absences_page.dart @@ -33,7 +33,7 @@ import 'absences_page.i18n.dart'; enum AbsenceFilter { absences, delays, misses } class SubjectAbsence { - Subject subject; + GradeSubject subject; List absences; double percentage; @@ -58,7 +58,7 @@ class _AbsencesPageState extends State late String firstName; late TabController _tabController; late List absences = []; - final Map _lessonCount = {}; + final Map _lessonCount = {}; @override void initState() { @@ -90,7 +90,7 @@ class _AbsencesPageState extends State } void buildSubjectAbsences() { - Map _absences = {}; + Map _absences = {}; for (final absence in absenceProvider.absences) { if (absence.delay != 0) continue; diff --git a/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart b/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart index 384afa5..5e531b5 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart @@ -16,7 +16,7 @@ import 'grade_calculator.i18n.dart'; class GradeCalculator extends StatefulWidget { const GradeCalculator(this.subject, {Key? key}) : super(key: key); - final Subject subject; + final GradeSubject subject; @override _GradeCalculatorState createState() => _GradeCalculatorState(); diff --git a/filcnaplo_mobile_ui/lib/pages/grades/fail_warning.dart b/filcnaplo_mobile_ui/lib/pages/grades/fail_warning.dart index 9e893fe..14b55cf 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/fail_warning.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/fail_warning.dart @@ -7,7 +7,7 @@ import 'grades_page.i18n.dart'; class FailWarning extends StatelessWidget { const FailWarning({Key? key, required this.subjectAvgs}) : super(key: key); - final Map subjectAvgs; + final Map subjectAvgs; @override Widget build(BuildContext context) { diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart b/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart index 21949b2..efc4cf4 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grade_subject_view.dart @@ -42,7 +42,7 @@ class GradeSubjectView extends StatefulWidget { const GradeSubjectView(this.subject, {Key? key, this.groupAverage = 0.0}) : super(key: key); - final Subject subject; + final GradeSubject subject; final double groupAverage; void push(BuildContext context, {bool root = false}) { @@ -77,7 +77,7 @@ class _GradeSubjectViewState extends State { String plan = ''; - List getSubjectGrades(Subject subject) => !gradeCalcMode + List getSubjectGrades(GradeSubject subject) => !gradeCalcMode ? gradeProvider.grades.where((e) => e.subject == subject).toList() : calculatorProvider.grades.where((e) => e.subject == subject).toList(); diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart index 8f0f6ca..9803597 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart @@ -48,24 +48,25 @@ class _GradesPageState extends State { int avgDropValue = 0; - List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider - .grades - .where((e) => - e.subject == subject && - e.type == GradeType.midYear && - (days == 0 || - e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) - .toList(); + List getSubjectGrades(GradeSubject subject, {int days = 0}) => + gradeProvider.grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date + .isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); void generateTiles() { - List subjects = gradeProvider.grades + List subjects = gradeProvider.grades .map((e) => e.subject) .toSet() .toList() ..sort((a, b) => a.name.compareTo(b.name)); List tiles = []; - Map subjectAvgs = {}; + Map subjectAvgs = {}; tiles.addAll(subjects.map((subject) { List subjectGrades = getSubjectGrades(subject); diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart index b14a215..01900ff 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/allsum_page.dart @@ -30,7 +30,7 @@ class _AllSumBodyState extends State { int avgDropValue = 0; bool animation = false; - List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider + List getSubjectGrades(GradeSubject subject, {int days = 0}) => gradeProvider .grades .where((e) => e.subject == subject && diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart index 5b75cbb..d56e3e4 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/grades_page.dart @@ -50,14 +50,15 @@ class _GradesBodyState extends State { int avgDropValue = 0; bool animation = false; - List getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider - .grades - .where((e) => - e.subject == subject && - e.type == GradeType.midYear && - (days == 0 || - e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) - .toList(); + List getSubjectGrades(GradeSubject subject, {int days = 0}) => + gradeProvider.grades + .where((e) => + e.subject == subject && + e.type == GradeType.midYear && + (days == 0 || + e.date + .isBefore(DateTime.now().subtract(Duration(days: days))))) + .toList(); @override void initState() { @@ -74,18 +75,18 @@ class _GradesBodyState extends State { } void generateTiles({required int filter}) { - List subjects = gradeProvider.grades + List subjects = gradeProvider.grades .map((e) => e.subject) .toSet() .toList() ..sort((a, b) => a.name.compareTo(b.name)); List tiles = []; - Map subjectAvgs = {}; + Map subjectAvgs = {}; var count = 1; - for (Subject subject in subjects) { + for (GradeSubject subject in subjects) { List subjectGrades = getSubjectGrades(subject); double avg = AverageHelper.averageEvals(subjectGrades); diff --git a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart index cd7c248..a90a02b 100644 --- a/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart +++ b/filcnaplo_mobile_ui/lib/screens/summary/pages/lessons_page.dart @@ -28,7 +28,7 @@ List faces = [ ]; class SubjectAbsence { - Subject subject; + GradeSubject subject; List absences; double percentage; @@ -52,7 +52,7 @@ class _LessonsBodyState extends State { late List absences = []; late List lessons = []; late List delays = []; - final Map _lessonCount = {}; + final Map _lessonCount = {}; @override void initState() { @@ -85,7 +85,7 @@ class _LessonsBodyState extends State { } void buildSubjectAbsences() { - Map _absences = {}; + Map _absences = {}; for (final absence in absenceProvider.absences) { if (absence.delay != 0) continue; diff --git a/filcnaplo_premium/lib/providers/goal_provider.dart b/filcnaplo_premium/lib/providers/goal_provider.dart index 18f3244..1529903 100644 --- a/filcnaplo_premium/lib/providers/goal_provider.dart +++ b/filcnaplo_premium/lib/providers/goal_provider.dart @@ -9,10 +9,10 @@ class GoalProvider extends ChangeNotifier { final UserProvider _user; late bool _done = false; - late Subject? _doneSubject; + late GradeSubject? _doneSubject; bool get hasDoneGoals => _done; - Subject? get doneSubject => _doneSubject; + GradeSubject? get doneSubject => _doneSubject; GoalProvider({ required DatabaseProvider database, @@ -24,7 +24,7 @@ class GoalProvider extends ChangeNotifier { var goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!); var beforeAvgs = await _db.userQuery.subjectGoalBefores(userId: _user.id!); - List subjects = gradeProvider.grades + List subjects = gradeProvider.grades .map((e) => e.subject) .toSet() .toList() @@ -45,7 +45,7 @@ class GoalProvider extends ChangeNotifier { _doneSubject = null; } - Future clearGoal(Subject subject) async { + Future clearGoal(GradeSubject subject) async { final goalPlans = await _db.userQuery.subjectGoalPlans(userId: _user.id!); final goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!); final goalBeforeGrades = diff --git a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_complete_modal.dart b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_complete_modal.dart index 0b2d9c1..cce1654 100644 --- a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_complete_modal.dart +++ b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_complete_modal.dart @@ -20,7 +20,7 @@ class GoalCompleteModal extends StatelessWidget { final UserProvider user; final DatabaseProvider database; - final Subject subject; + final GradeSubject subject; final double goalAverage; final double beforeAverage; @@ -218,7 +218,7 @@ class GoalCompleteModal extends StatelessWidget { } static Future show( - Subject subject, { + GradeSubject subject, { required BuildContext context, }) async { UserProvider user = Provider.of(context, listen: false); diff --git a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart index 22878a9..31e445b 100644 --- a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart +++ b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart @@ -64,7 +64,7 @@ class GoalPlanner { form: '', groupId: '', type: GradeType.midYear, - subject: Subject.fromJson({}), + subject: GradeSubject.fromJson({}), mode: Category.fromJson({}), seenDate: DateTime(0), writeDate: DateTime(0), diff --git a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner_screen.dart b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner_screen.dart index eef91b3..258a0f1 100644 --- a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner_screen.dart +++ b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner_screen.dart @@ -25,7 +25,7 @@ enum PlanResult { } class GoalPlannerScreen extends StatefulWidget { - final Subject subject; + final GradeSubject subject; const GoalPlannerScreen({Key? key, required this.subject}) : super(key: key); @@ -42,7 +42,7 @@ class _GoalPlannerScreenState extends State { bool gradeCalcMode = false; - List getSubjectGrades(Subject subject) => !gradeCalcMode + List getSubjectGrades(GradeSubject subject) => !gradeCalcMode ? gradeProvider.grades.where((e) => e.subject == subject).toList() : calculatorProvider.grades.where((e) => e.subject == subject).toList(); diff --git a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_state_screen.dart b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_state_screen.dart index 0141fac..39123ed 100644 --- a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_state_screen.dart +++ b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_state_screen.dart @@ -22,7 +22,7 @@ import 'goal_planner_screen.dart'; import 'graph.dart'; class GoalStateScreen extends StatefulWidget { - final Subject subject; + final GradeSubject subject; const GoalStateScreen({Key? key, required this.subject}) : super(key: key); @@ -77,10 +77,10 @@ class _GoalStateScreenState extends State { setState(() {}); } - List getSubjectGrades(Subject subject) => + List getSubjectGrades(GradeSubject subject) => gradeProvider.grades.where((e) => (e.subject == subject)).toList(); - List getAfterGoalGrades(Subject subject) => gradeProvider.grades + List getAfterGoalGrades(GradeSubject subject) => gradeProvider.grades .where((e) => (e.subject == subject && e.date.isAfter(goalPinDate))) .toList(); diff --git a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart index 37daf97..d20f7cd 100644 --- a/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart +++ b/filcnaplo_premium/lib/ui/mobile/settings/modify_subject_names.dart @@ -91,7 +91,7 @@ class _ModifySubjectNamesState extends State { final _subjectName = TextEditingController(); String? selectedSubjectId; - late List subjects; + late List subjects; late UserProvider user; late DatabaseProvider dbProvider; late SettingsProvider settings; @@ -294,9 +294,11 @@ class _ModifySubjectNamesState extends State { children: [ Panel( child: SwitchListTile( - title: Text("italics_toggle".i18n), - onChanged: (value) => settings.update(renamedSubjectsItalics: value), - value: settings.renamedSubjectsItalics,), + title: Text("italics_toggle".i18n), + onChanged: (value) => + settings.update(renamedSubjectsItalics: value), + value: settings.renamedSubjectsItalics, + ), ), const SizedBox( height: 20, @@ -339,7 +341,7 @@ class _ModifySubjectNamesState extends State { child: Column( children: snapshot.data!.keys.map( (key) { - Subject? subject = subjects + GradeSubject? subject = subjects .firstWhere((element) => key == element.id); String renameTo = snapshot.data![key]!; return RenamedSubjectItem( @@ -385,7 +387,7 @@ class RenamedSubjectItem extends StatelessWidget { required this.removeCallback, }) : super(key: key); - final Subject subject; + final GradeSubject subject; final String renamedTo; final void Function() modifyCallback; final void Function() removeCallback;