From ded029e4cbf705d8253d6fc0db8437be7f6eda32 Mon Sep 17 00:00:00 2001 From: Kima Date: Sat, 26 Aug 2023 15:15:56 +0200 Subject: [PATCH] maybe finished teacher rename --- .../lib/screens/settings/settings_screen.dart | 2 - filcnaplo_kreta_api/lib/models/exam.dart | 17 +++++-- filcnaplo_kreta_api/lib/models/grade.dart | 51 ++++++++++++++----- filcnaplo_kreta_api/lib/models/homework.dart | 5 +- filcnaplo_kreta_api/lib/models/lesson.dart | 36 ++++++++----- filcnaplo_kreta_api/lib/models/note.dart | 21 +++++--- .../lib/common/widgets/exam/exam_view.dart | 22 +++++--- .../lib/common/widgets/grade/grade_view.dart | 33 +++++++++--- .../widgets/homework/homework_view.dart | 12 ++++- .../common/widgets/lesson/lesson_view.dart | 33 +++++++++--- .../lib/common/widgets/note/note_tile.dart | 18 +++++-- .../lib/common/widgets/note/note_view.dart | 20 ++++++-- .../grades/calculator/grade_calculator.dart | 25 ++++++--- .../ui/mobile/goal_planner/goal_planner.dart | 31 +++++++---- .../mobile/settings/modify_teacher_names.dart | 12 ++--- 15 files changed, 246 insertions(+), 92 deletions(-) diff --git a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart index aef41ff..90a3213 100644 --- a/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_desktop_ui/lib/screens/settings/settings_screen.dart @@ -1,6 +1,4 @@ import 'package:filcnaplo/api/providers/update_provider.dart'; -import 'package:filcnaplo/theme/colors/accent.dart'; -import 'package:filcnaplo/theme/observer.dart'; import 'package:filcnaplo_kreta_api/providers/absence_provider.dart'; import 'package:filcnaplo_kreta_api/providers/event_provider.dart'; import 'package:filcnaplo_kreta_api/providers/exam_provider.dart'; diff --git a/filcnaplo_kreta_api/lib/models/exam.dart b/filcnaplo_kreta_api/lib/models/exam.dart index ac25bc9..5f7689b 100644 --- a/filcnaplo_kreta_api/lib/models/exam.dart +++ b/filcnaplo_kreta_api/lib/models/exam.dart @@ -1,4 +1,5 @@ import 'category.dart'; +import 'teacher.dart'; class Exam { Map? json; @@ -7,7 +8,7 @@ class Exam { Category? mode; int? subjectIndex; String subjectName; - String teacher; + Teacher teacher; String description; String group; String id; @@ -28,14 +29,20 @@ class Exam { factory Exam.fromJson(Map json) { return Exam( id: json["Uid"] ?? "", - date: json["BejelentesDatuma"] != null ? DateTime.parse(json["BejelentesDatuma"]).toLocal() : DateTime(0), - writeDate: json["Datum"] != null ? DateTime.parse(json["Datum"]).toLocal() : DateTime(0), + date: json["BejelentesDatuma"] != null + ? DateTime.parse(json["BejelentesDatuma"]).toLocal() + : DateTime(0), + writeDate: json["Datum"] != null + ? DateTime.parse(json["Datum"]).toLocal() + : DateTime(0), mode: json["Modja"] != null ? Category.fromJson(json["Modja"]) : null, subjectIndex: json["OrarendiOraOraszama"], subjectName: json["TantargyNeve"] ?? "", - teacher: (json["RogzitoTanarNeve"] ?? "").trim(), + teacher: Teacher.fromString((json["RogzitoTanarNeve"] ?? "").trim()), description: (json["Temaja"] ?? "").trim(), - group: json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] ?? "" : "", + group: json["OsztalyCsoport"] != null + ? json["OsztalyCsoport"]["Uid"] ?? "" + : "", json: json, ); } diff --git a/filcnaplo_kreta_api/lib/models/grade.dart b/filcnaplo_kreta_api/lib/models/grade.dart index de82478..249f303 100644 --- a/filcnaplo_kreta_api/lib/models/grade.dart +++ b/filcnaplo_kreta_api/lib/models/grade.dart @@ -1,13 +1,14 @@ import 'package:filcnaplo/utils/format.dart'; import 'category.dart'; import 'subject.dart'; +import 'teacher.dart'; class Grade { Map? json; String id; DateTime date; GradeValue value; - String teacher; + Teacher teacher; String description; GradeType type; String groupId; @@ -38,23 +39,35 @@ class Grade { factory Grade.fromJson(Map json) { return Grade( id: json["Uid"] ?? "", - date: json["KeszitesDatuma"] != null ? DateTime.parse(json["KeszitesDatuma"]).toLocal() : DateTime(0), + date: json["KeszitesDatuma"] != null + ? DateTime.parse(json["KeszitesDatuma"]).toLocal() + : DateTime(0), value: GradeValue( json["SzamErtek"] ?? 0, json["SzovegesErtek"] ?? "", json["SzovegesErtekelesRovidNev"] ?? "", json["SulySzazalekErteke"] ?? 0, - percentage: json["ErtekFajta"] != null ? json["ErtekFajta"]["Uid"] == "3,Szazalekos" : false, + percentage: json["ErtekFajta"] != null + ? json["ErtekFajta"]["Uid"] == "3,Szazalekos" + : false, ), - teacher: (json["ErtekeloTanarNeve"] ?? "").trim(), + teacher: Teacher.fromString((json["ErtekeloTanarNeve"] ?? "").trim()), description: json["Tema"] ?? "", - type: json["Tipus"] != null ? Category.getGradeType(json["Tipus"]["Nev"]) : GradeType.unknown, + type: json["Tipus"] != null + ? Category.getGradeType(json["Tipus"]["Nev"]) + : GradeType.unknown, groupId: (json["OsztalyCsoport"] ?? {})["Uid"] ?? "", subject: Subject.fromJson(json["Tantargy"] ?? {}), - gradeType: json["ErtekFajta"] != null ? Category.fromJson(json["ErtekFajta"]) : null, + gradeType: json["ErtekFajta"] != null + ? Category.fromJson(json["ErtekFajta"]) + : null, mode: Category.fromJson(json["Mod"] ?? {}), - writeDate: json["RogzitesDatuma"] != null ? DateTime.parse(json["RogzitesDatuma"]).toLocal() : DateTime(0), - seenDate: json["LattamozasDatuma"] != null ? DateTime.parse(json["LattamozasDatuma"]).toLocal() : DateTime(0), + writeDate: json["RogzitesDatuma"] != null + ? DateTime.parse(json["RogzitesDatuma"]).toLocal() + : DateTime(0), + seenDate: json["LattamozasDatuma"] != null + ? DateTime.parse(json["LattamozasDatuma"]).toLocal() + : DateTime(0), form: (json["Jelleg"] ?? "Na") != "Na" ? json["Jelleg"] : "", json: json, ); @@ -76,7 +89,8 @@ class GradeValue { set value(int v) => _value = v; int get value { String _valueName = valueName.toLowerCase().specialChars(); - if (_value == 0 && ["peldas", "jo", "valtozo", "rossz", "hanyag"].contains(_valueName)) { + if (_value == 0 && + ["peldas", "jo", "valtozo", "rossz", "hanyag"].contains(_valueName)) { switch (_valueName) { case "peldas": return 5; @@ -101,7 +115,8 @@ class GradeValue { set weight(int v) => _weight = v; int get weight { String _valueName = valueName.toLowerCase().specialChars(); - if (_value == 0 && ["peldas", "jo", "valtozo", "rossz", "hanyag"].contains(_valueName)) { + if (_value == 0 && + ["peldas", "jo", "valtozo", "rossz", "hanyag"].contains(_valueName)) { return 0; } return _weight; @@ -110,11 +125,23 @@ class GradeValue { final bool _percentage; bool get percentage => _percentage; - GradeValue(int value, String valueName, this.shortName, int weight, {bool percentage = false}) + GradeValue(int value, String valueName, this.shortName, int weight, + {bool percentage = false}) : _value = value, _valueName = valueName, _weight = weight, _percentage = percentage; } -enum GradeType { midYear, firstQ, secondQ, halfYear, thirdQ, fourthQ, endYear, levelExam, ghost, unknown } +enum GradeType { + midYear, + firstQ, + secondQ, + halfYear, + thirdQ, + fourthQ, + endYear, + levelExam, + ghost, + unknown +} diff --git a/filcnaplo_kreta_api/lib/models/homework.dart b/filcnaplo_kreta_api/lib/models/homework.dart index b233a3c..bd4ab39 100644 --- a/filcnaplo_kreta_api/lib/models/homework.dart +++ b/filcnaplo_kreta_api/lib/models/homework.dart @@ -1,6 +1,7 @@ import 'package:filcnaplo_kreta_api/client/api.dart'; import 'subject.dart'; +import 'teacher.dart'; class Homework { Map? json; @@ -9,7 +10,7 @@ class Homework { DateTime deadline; bool byTeacher; bool homeworkEnabled; - String teacher; + Teacher teacher; String content; Subject subject; String group; @@ -45,7 +46,7 @@ class Homework { : DateTime(0), byTeacher: json["IsTanarRogzitette"] ?? true, homeworkEnabled: json["IsTanuloHaziFeladatEnabled"] ?? false, - teacher: (json["RogzitoTanarNeve"] ?? "").trim(), + teacher: Teacher.fromString((json["RogzitoTanarNeve"] ?? "").trim()), content: (json["Szoveg"] ?? "").trim(), subject: Subject.fromJson(json["Tantargy"] ?? {}), group: json["OsztalyCsoport"] != null diff --git a/filcnaplo_kreta_api/lib/models/lesson.dart b/filcnaplo_kreta_api/lib/models/lesson.dart index b724734..0ac9ab2 100644 --- a/filcnaplo_kreta_api/lib/models/lesson.dart +++ b/filcnaplo_kreta_api/lib/models/lesson.dart @@ -1,5 +1,6 @@ import 'subject.dart'; import 'category.dart'; +import 'teacher.dart'; class Lesson { Map? json; @@ -8,8 +9,8 @@ class Lesson { Subject subject; String lessonIndex; int? lessonYearIndex; - String substituteTeacher; - String teacher; + Teacher? substituteTeacher; + Teacher teacher; bool homeworkEnabled; DateTime start; DateTime end; @@ -31,7 +32,7 @@ class Lesson { required this.subject, required this.lessonIndex, this.lessonYearIndex, - this.substituteTeacher = "", + this.substituteTeacher, required this.teacher, this.homeworkEnabled = false, required this.start, @@ -53,27 +54,38 @@ class Lesson { factory Lesson.fromJson(Map json) { return Lesson( id: json["Uid"] ?? "", - status: json["Allapot"] != null ? Category.fromJson(json["Allapot"]) : null, - date: json["Datum"] != null ? DateTime.parse(json["Datum"]).toLocal() : DateTime(0), + status: + json["Allapot"] != null ? Category.fromJson(json["Allapot"]) : null, + date: json["Datum"] != null + ? DateTime.parse(json["Datum"]).toLocal() + : DateTime(0), subject: Subject.fromJson(json["Tantargy"] ?? {}), lessonIndex: json["Oraszam"] != null ? json["Oraszam"].toString() : "+", lessonYearIndex: json["OraEvesSorszama"], - substituteTeacher: (json["HelyettesTanarNeve"] ?? "").trim(), - teacher: (json["TanarNeve"] ?? "").trim(), + substituteTeacher: + Teacher.fromString((json["HelyettesTanarNeve"] ?? "").trim()), + teacher: Teacher.fromString((json["TanarNeve"] ?? "").trim()), homeworkEnabled: json["IsTanuloHaziFeladatEnabled"] ?? false, - start: json["KezdetIdopont"] != null ? DateTime.parse(json["KezdetIdopont"]).toLocal() : DateTime(0), + start: json["KezdetIdopont"] != null + ? DateTime.parse(json["KezdetIdopont"]).toLocal() + : DateTime(0), studentPresence: json["TanuloJelenlet"] != null ? (json["TanuloJelenlet"]["Nev"] ?? "") == "Hianyzas" ? false : true : true, - end: json["VegIdopont"] != null ? DateTime.parse(json["VegIdopont"]).toLocal() : DateTime(0), + end: json["VegIdopont"] != null + ? DateTime.parse(json["VegIdopont"]).toLocal() + : DateTime(0), homeworkId: json["HaziFeladatUid"] ?? "", exam: json["BejelentettSzamonkeresUid"] ?? "", type: json["Tipus"] != null ? Category.fromJson(json["Tipus"]) : null, description: json["Tema"] ?? "", - room: ((json["TeremNeve"] ?? "").split("_").join(" ") as String).replaceAll(RegExp(r" ?terem ?", caseSensitive: false), ""), - groupName: json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Nev"] ?? "" : "", + room: ((json["TeremNeve"] ?? "").split("_").join(" ") as String) + .replaceAll(RegExp(r" ?terem ?", caseSensitive: false), ""), + groupName: json["OsztalyCsoport"] != null + ? json["OsztalyCsoport"]["Nev"] ?? "" + : "", name: json["Nev"] ?? "", online: json["IsDigitalisOra"] ?? false, isEmpty: json['isEmpty'] ?? false, @@ -92,6 +104,6 @@ class Lesson { return null; } - bool get isChanged => status?.name == "Elmaradt" || substituteTeacher != ""; + bool get isChanged => status?.name == "Elmaradt" || substituteTeacher != null; bool get swapDesc => room.length > 8; } diff --git a/filcnaplo_kreta_api/lib/models/note.dart b/filcnaplo_kreta_api/lib/models/note.dart index 1b15b43..ba94fa5 100644 --- a/filcnaplo_kreta_api/lib/models/note.dart +++ b/filcnaplo_kreta_api/lib/models/note.dart @@ -1,4 +1,5 @@ import 'category.dart'; +import 'teacher.dart'; class Note { Map? json; @@ -6,7 +7,7 @@ class Note { String title; DateTime date; DateTime submitDate; - String teacher; + Teacher teacher; DateTime seenDate; String groupId; String content; @@ -29,11 +30,19 @@ class Note { return Note( id: json["Uid"] ?? "", title: json["Cim"] ?? "", - date: json["Datum"] != null ? DateTime.parse(json["Datum"]).toLocal() : DateTime(0), - submitDate: json["KeszitesDatuma"] != null ? DateTime.parse(json["KeszitesDatuma"]).toLocal() : DateTime(0), - teacher: (json["KeszitoTanarNeve"] ?? "").trim(), - seenDate: json["LattamozasDatuma"] != null ? DateTime.parse(json["LattamozasDatuma"]).toLocal() : DateTime(0), - groupId: json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] ?? "" : "", + date: json["Datum"] != null + ? DateTime.parse(json["Datum"]).toLocal() + : DateTime(0), + submitDate: json["KeszitesDatuma"] != null + ? DateTime.parse(json["KeszitesDatuma"]).toLocal() + : DateTime(0), + teacher: Teacher.fromString((json["KeszitoTanarNeve"] ?? "").trim()), + seenDate: json["LattamozasDatuma"] != null + ? DateTime.parse(json["LattamozasDatuma"]).toLocal() + : DateTime(0), + groupId: json["OsztalyCsoport"] != null + ? json["OsztalyCsoport"]["Uid"] ?? "" + : "", content: json["Tartalom"].replaceAll("\r", "") ?? "", type: json["Tipus"] != null ? Category.fromJson(json["Tipus"]) : null, json: json, diff --git a/filcnaplo_mobile_ui/lib/common/widgets/exam/exam_view.dart b/filcnaplo_mobile_ui/lib/common/widgets/exam/exam_view.dart index 188787c..4061baa 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/exam/exam_view.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/exam/exam_view.dart @@ -12,7 +12,8 @@ class ExamView extends StatelessWidget { final Exam exam; - static show(Exam exam, {required BuildContext context}) => showBottomCard(context: context, child: ExamView(exam)); + static show(Exam exam, {required BuildContext context}) => + showBottomCard(context: context, child: ExamView(exam)); @override Widget build(BuildContext context) { @@ -27,7 +28,8 @@ class ExamView extends StatelessWidget { leading: Padding( padding: const EdgeInsets.only(left: 6.0), child: Icon( - SubjectIcon.resolveVariant(subjectName: exam.subjectName, context: context), + SubjectIcon.resolveVariant( + subjectName: exam.subjectName, context: context), size: 36.0, color: AppColors.of(context).text.withOpacity(.75), ), @@ -39,7 +41,10 @@ class ExamView extends StatelessWidget { style: const TextStyle(fontWeight: FontWeight.w600), ), subtitle: Text( - exam.teacher, + (exam.teacher.isRenamed + ? exam.teacher.renamedTo + : exam.teacher.name) ?? + '', maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w500), @@ -51,9 +56,14 @@ class ExamView extends StatelessWidget { ), // Details - if (exam.writeDate.year != 0) Detail(title: "date".i18n, description: exam.writeDate.format(context)), - if (exam.description != "") Detail(title: "description".i18n, description: exam.description), - if (exam.mode != null) Detail(title: "mode".i18n, description: exam.mode!.description), + if (exam.writeDate.year != 0) + Detail( + title: "date".i18n, + description: exam.writeDate.format(context)), + if (exam.description != "") + Detail(title: "description".i18n, description: exam.description), + if (exam.mode != null) + Detail(title: "mode".i18n, description: exam.mode!.description), ], ), ); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_view.dart b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_view.dart index c510961..4673b3d 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_view.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/grade/grade_view.dart @@ -11,7 +11,8 @@ import 'grade_view.i18n.dart'; class GradeView extends StatelessWidget { const GradeView(this.grade, {Key? key}) : super(key: key); - static show(Grade grade, {required BuildContext context}) => showBottomCard(context: context, child: GradeView(grade)); + static show(Grade grade, {required BuildContext context}) => + showBottomCard(context: context, child: GradeView(grade)); final Grade grade; @@ -30,10 +31,21 @@ class GradeView extends StatelessWidget { grade.subject.renamedTo ?? grade.subject.name.capital(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w600, fontStyle: grade.subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null), + style: TextStyle( + fontWeight: FontWeight.w600, + fontStyle: grade.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null), ), subtitle: Text( - !Provider.of(context, listen: false).presentationMode ? grade.teacher : "Tanár", + !Provider.of(context, listen: false) + .presentationMode + ? (grade.teacher.isRenamed + ? grade.teacher.renamedTo + : grade.teacher.name) ?? + '' + : "Tanár", maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w500), @@ -49,13 +61,20 @@ class GradeView extends StatelessWidget { title: "value".i18n, description: "${grade.value.valueName} " + percentText(), ), - if (grade.description != "") Detail(title: "description".i18n, description: grade.description), - if (grade.mode.description != "") Detail(title: "mode".i18n, description: grade.mode.description), - if (grade.writeDate.year != 0) Detail(title: "date".i18n, description: grade.writeDate.format(context)), + if (grade.description != "") + Detail(title: "description".i18n, description: grade.description), + if (grade.mode.description != "") + Detail(title: "mode".i18n, description: grade.mode.description), + if (grade.writeDate.year != 0) + Detail( + title: "date".i18n, + description: grade.writeDate.format(context)), ], ), ); } - String percentText() => grade.value.weight != 100 && grade.value.weight > 0 ? "${grade.value.weight}%" : ""; + String percentText() => grade.value.weight != 100 && grade.value.weight > 0 + ? "${grade.value.weight}%" + : ""; } diff --git a/filcnaplo_mobile_ui/lib/common/widgets/homework/homework_view.dart b/filcnaplo_mobile_ui/lib/common/widgets/homework/homework_view.dart index fef95b5..8e26d92 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/homework/homework_view.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/homework/homework_view.dart @@ -51,10 +51,18 @@ class HomeworkView extends StatelessWidget { homework.subject.renamedTo ?? homework.subject.name.capital(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w600, fontStyle: homework.subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null), + style: TextStyle( + fontWeight: FontWeight.w600, + fontStyle: homework.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null), ), subtitle: Text( - homework.teacher, + (homework.teacher.isRenamed + ? homework.teacher.renamedTo + : homework.teacher.name) ?? + '', maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w500), diff --git a/filcnaplo_mobile_ui/lib/common/widgets/lesson/lesson_view.dart b/filcnaplo_mobile_ui/lib/common/widgets/lesson/lesson_view.dart index 45dd6c0..222e05f 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/lesson/lesson_view.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/lesson/lesson_view.dart @@ -54,10 +54,23 @@ class LessonView extends StatelessWidget { lesson.subject.renamedTo ?? lesson.subject.name.capital(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontWeight: FontWeight.w600, fontStyle: lesson.subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null), + style: TextStyle( + fontWeight: FontWeight.w600, + fontStyle: lesson.subject.isRenamed && + settingsProvider.renamedSubjectsItalics + ? FontStyle.italic + : null), ), subtitle: Text( - lesson.substituteTeacher == "" ? lesson.teacher : lesson.substituteTeacher, + ((lesson.substituteTeacher == null || + lesson.substituteTeacher!.name == "") + ? (lesson.teacher.isRenamed + ? lesson.teacher.renamedTo + : lesson.teacher.name) + : (lesson.substituteTeacher!.isRenamed + ? lesson.substituteTeacher!.renamedTo + : lesson.substituteTeacher!.name)) ?? + '', maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w500), @@ -69,10 +82,18 @@ class LessonView extends StatelessWidget { ), // Details - if (lesson.room != "") Detail(title: "Room".i18n, description: lesson.room.replaceAll("_", " ")), - if (lesson.description != "") Detail(title: "Description".i18n, description: lesson.description), - if (lesson.lessonYearIndex != null) Detail(title: "Lesson Number".i18n, description: "${lesson.lessonYearIndex}."), - if (lesson.groupName != "") Detail(title: "Group".i18n, description: lesson.groupName), + if (lesson.room != "") + Detail( + title: "Room".i18n, + description: lesson.room.replaceAll("_", " ")), + if (lesson.description != "") + Detail(title: "Description".i18n, description: lesson.description), + if (lesson.lessonYearIndex != null) + Detail( + title: "Lesson Number".i18n, + description: "${lesson.lessonYearIndex}."), + if (lesson.groupName != "") + Detail(title: "Group".i18n, description: lesson.groupName), ], ), ); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/note/note_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/note/note_tile.dart index 89ba313..c3761c9 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/note/note_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/note/note_tile.dart @@ -4,7 +4,8 @@ import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.dart'; import 'package:flutter/material.dart'; class NoteTile extends StatelessWidget { - const NoteTile(this.note, {Key? key, this.onTap, this.padding}) : super(key: key); + const NoteTile(this.note, {Key? key, this.onTap, this.padding}) + : super(key: key); final Note note; final void Function()? onTap; @@ -20,11 +21,20 @@ class NoteTile extends StatelessWidget { visualDensity: VisualDensity.compact, contentPadding: const EdgeInsets.only(left: 8.0, right: 12.0), onTap: onTap, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)), leading: ProfileImage( - name: note.teacher, + name: (note.teacher.isRenamed + ? note.teacher.renamedTo + : note.teacher.name) ?? + '', radius: 22.0, - backgroundColor: ColorUtils.stringToColor(note.teacher), + backgroundColor: ColorUtils.stringToColor( + (note.teacher.isRenamed + ? note.teacher.renamedTo + : note.teacher.name) ?? + '', + ), ), title: Text( note.title, diff --git a/filcnaplo_mobile_ui/lib/common/widgets/note/note_view.dart b/filcnaplo_mobile_ui/lib/common/widgets/note/note_view.dart index 98aecea..64680af 100755 --- a/filcnaplo_mobile_ui/lib/common/widgets/note/note_view.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/note/note_view.dart @@ -12,7 +12,8 @@ class NoteView extends StatelessWidget { final Note note; - static void show(Note note, {required BuildContext context}) => showSlidingBottomSheet(context: context, child: NoteView(note)); + static void show(Note note, {required BuildContext context}) => + showSlidingBottomSheet(context: context, child: NoteView(note)); @override Widget build(BuildContext context) { @@ -25,9 +26,17 @@ class NoteView extends StatelessWidget { // Header ListTile( leading: ProfileImage( - name: note.teacher, + name: (note.teacher.isRenamed + ? note.teacher.renamedTo + : note.teacher.name) ?? + '', radius: 22.0, - backgroundColor: ColorUtils.stringToColor(note.teacher), + backgroundColor: ColorUtils.stringToColor( + (note.teacher.isRenamed + ? note.teacher.renamedTo + : note.teacher.name) ?? + '', + ), ), title: Text( note.title, @@ -36,7 +45,10 @@ class NoteView extends StatelessWidget { style: const TextStyle(fontWeight: FontWeight.w600), ), subtitle: Text( - note.teacher, + (note.teacher.isRenamed + ? note.teacher.renamedTo + : note.teacher.name) ?? + '', maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w500), 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 85c00c5..384afa5 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/calculator/grade_calculator.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:filcnaplo_kreta_api/models/category.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/models/teacher.dart'; import 'package:filcnaplo_mobile_ui/common/custom_snack_bar.dart'; import 'package:filcnaplo_mobile_ui/common/material_action_button.dart'; import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; @@ -42,7 +43,8 @@ class _GradeCalculatorState extends State { padding: const EdgeInsets.only(bottom: 8.0), child: Text( "Grade Calculator".i18n, - style: const TextStyle(fontSize: 20.0, fontWeight: FontWeight.w600), + style: + const TextStyle(fontSize: 20.0, fontWeight: FontWeight.w600), ), ), @@ -63,7 +65,9 @@ class _GradeCalculatorState extends State { Container( width: 80.0, padding: const EdgeInsets.only(right: 12.0), - child: Center(child: GradeValueWidget(GradeValue(newValue.toInt(), "", "", 0))), + child: Center( + child: GradeValueWidget( + GradeValue(newValue.toInt(), "", "", 0))), ), ]), @@ -90,7 +94,8 @@ class _GradeCalculatorState extends State { child: Center( child: TextField( controller: _weightController, - style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 22.0), + style: const TextStyle( + fontWeight: FontWeight.w600, fontSize: 22.0), autocorrect: false, textAlign: TextAlign.right, keyboardType: TextInputType.number, @@ -122,7 +127,8 @@ class _GradeCalculatorState extends State { child: Text("Add Grade".i18n), onPressed: () { if (calculatorProvider.ghosts.length >= 50) { - ScaffoldMessenger.of(context).showSnackBar(CustomSnackBar(content: Text("limit_reached".i18n), context: context)); + ScaffoldMessenger.of(context).showSnackBar(CustomSnackBar( + content: Text("limit_reached".i18n), context: context)); return; } @@ -133,7 +139,11 @@ class _GradeCalculatorState extends State { grades.sort((a, b) => -a.writeDate.compareTo(b.writeDate)); date = grades.first.date.add(const Duration(days: 7)); } else { - List grades = calculatorProvider.grades.where((e) => e.type == GradeType.midYear && e.subject == widget.subject).toList(); + List grades = calculatorProvider.grades + .where((e) => + e.type == GradeType.midYear && + e.subject == widget.subject) + .toList(); grades.sort((a, b) => -a.writeDate.compareTo(b.writeDate)); date = grades.first.date; } @@ -143,8 +153,9 @@ class _GradeCalculatorState extends State { date: date, writeDate: date, description: "Ghost Grade".i18n, - value: GradeValue(newValue.toInt(), "", "", newWeight.toInt()), - teacher: "Ghost", + value: + GradeValue(newValue.toInt(), "", "", newWeight.toInt()), + teacher: Teacher.fromString("Ghost"), type: GradeType.ghost, form: "", subject: widget.subject, 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 fd4d508..52b4a93 100644 --- a/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart +++ b/filcnaplo_premium/lib/ui/mobile/goal_planner/goal_planner.dart @@ -13,6 +13,7 @@ import 'dart:math'; import 'package:filcnaplo_kreta_api/models/category.dart'; import 'package:filcnaplo_kreta_api/models/grade.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart'; +import 'package:filcnaplo_kreta_api/models/teacher.dart'; import 'package:flutter/foundation.dart' show listEquals; /// Generate list of grades that achieve the wanted goal. @@ -46,7 +47,8 @@ class GoalPlanner { for (int i = g.max; i >= 0; i--) { int newGradeToAdd = g.gradeToAdd - 1; - List newPlan = GoalPlannerHelper._addToList(g.plan, g.gradeToAdd, i); + List newPlan = + GoalPlannerHelper._addToList(g.plan, g.gradeToAdd, i); Avg newAvg = GoalPlannerHelper._addToAvg(g.currentAvg, g.gradeToAdd, i); int newN = GoalPlannerHelper.howManyNeeded( @@ -57,7 +59,7 @@ class GoalPlanner { id: '', date: DateTime(0), value: GradeValue(e, '', '', 100), - teacher: '', + teacher: Teacher.fromString(''), description: '', form: '', groupId: '', @@ -83,7 +85,8 @@ class GoalPlanner { grades, goal, ), - Avg(GoalPlannerHelper.averageEvals(grades), GoalPlannerHelper.weightSum(grades)), + Avg(GoalPlannerHelper.averageEvals(grades), + GoalPlannerHelper.weightSum(grades)), [], ), ); @@ -92,7 +95,9 @@ class GoalPlanner { for (var e in plans) { e.sum = e.plan.fold(0, (int a, b) => a + b); e.avg = e.sum / e.plan.length; - e.sigma = sqrt(e.plan.map((i) => pow(i - e.avg, 2)).fold(0, (num a, b) => a + b) / e.plan.length); + e.sigma = sqrt( + e.plan.map((i) => pow(i - e.avg, 2)).fold(0, (num a, b) => a + b) / + e.plan.length); } // filter without aggression @@ -141,7 +146,8 @@ class Plan { } class GoalPlannerHelper { - static Avg _addToAvg(Avg base, int grade, int n) => Avg((base.avg * base.n + grade * n) / (base.n + n), base.n + n); + static Avg _addToAvg(Avg base, int grade, int n) => + Avg((base.avg * base.n + grade * n) / (base.n + n), base.n + n); static List _addToList(List l, T e, int n) { if (n == 0) return l; @@ -158,15 +164,20 @@ class GoalPlannerHelper { if (avg >= goal) return 0; if (grade * 1.0 == goal) return -1; int candidate = (wsum * (avg - goal) / (goal - grade)).floor(); - return (candidate * grade + avg * wsum) / (candidate + wsum) < goal ? candidate + 1 : candidate; + return (candidate * grade + avg * wsum) / (candidate + wsum) < goal + ? candidate + 1 + : candidate; } static double averageEvals(List grades, {bool finalAvg = false}) { - double average = - grades.map((e) => e.value.value * e.value.weight / 100.0).fold(0.0, (double a, double b) => a + b) / weightSum(grades, finalAvg: finalAvg); + double average = grades + .map((e) => e.value.value * e.value.weight / 100.0) + .fold(0.0, (double a, double b) => a + b) / + weightSum(grades, finalAvg: finalAvg); return average.isNaN ? 0.0 : average; } - static double weightSum(List grades, {bool finalAvg = false}) => - grades.map((e) => finalAvg ? 1 : e.value.weight / 100).fold(0, (a, b) => a + b); + static double weightSum(List grades, {bool finalAvg = false}) => grades + .map((e) => finalAvg ? 1 : e.value.weight / 100) + .fold(0, (a, b) => a + b); } diff --git a/filcnaplo_premium/lib/ui/mobile/settings/modify_teacher_names.dart b/filcnaplo_premium/lib/ui/mobile/settings/modify_teacher_names.dart index e03a35e..a14015b 100644 --- a/filcnaplo_premium/lib/ui/mobile/settings/modify_teacher_names.dart +++ b/filcnaplo_premium/lib/ui/mobile/settings/modify_teacher_names.dart @@ -99,13 +99,11 @@ class _ModifyTeacherNamesState extends State { void initState() { super.initState(); teachers = (Provider.of(context, listen: false) - .grades - .map((e) => e.teacher) - .toSet() - .toList() - ..sort((a, b) => a.compareTo(b))) - .map((e) => Teacher.fromString(e)) - .toList(); + .grades + .map((e) => e.teacher) + .toSet() + .toList() + ..sort((a, b) => a.name.compareTo(b.name))); print(teachers.map((e) => e.name)); user = Provider.of(context, listen: false); dbProvider = Provider.of(context, listen: false);