From 8bc695b70f376ac99440a1878ebdd182b70fb6a8 Mon Sep 17 00:00:00 2001 From: ezyyeah Date: Sat, 31 Dec 2022 00:45:10 +0100 Subject: [PATCH] subjects rename --- filcnaplo/lib/database/init.dart | 6 ++++- filcnaplo/lib/database/query.dart | 24 ++++++++++++------- filcnaplo/lib/database/store.dart | 5 ++++ filcnaplo/lib/models/settings.dart | 11 ++++++++- .../lib/ui/widgets/grade/grade_tile.dart | 4 ++-- .../lib/ui/widgets/lesson/lesson_tile.dart | 14 +++++++---- 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index 958c3c8..63f8078 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -16,7 +16,7 @@ const settingsDB = DatabaseStruct("settings", { "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int, "notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications "x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int, - "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "last_account_id": String, + "grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "last_account_id": String, "renamed_subjects_enabled": int, }); // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING // YOU'VE BEEN WARNED!!! @@ -27,6 +27,8 @@ const usersDB = DatabaseStruct("users", { const userDataDB = DatabaseStruct("user_data", { "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String, "events": String, "absences": String, "group_averages": String, + // renamed subjects // non kreta data + "renamed_subjects": String, // "subject_lesson_count": String, // non kreta data "last_seen_grade": int, }); @@ -67,6 +69,8 @@ Future initDB(DatabaseProvider database) async { await migrateDB(db, struct: userDataDB, defaultValues: { "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]", "group_averages": "[]", + // renamed subjects // non kreta data + "renamed_subjects": "{}", // "subject_lesson_count": "{}", // non kreta data "last_seen_grade": 0, }); diff --git a/filcnaplo/lib/database/query.dart b/filcnaplo/lib/database/query.dart index 32b4264..2efec87 100644 --- a/filcnaplo/lib/database/query.dart +++ b/filcnaplo/lib/database/query.dart @@ -52,21 +52,21 @@ class UserDatabaseQuery { final Database db; - Future> getGrades({required String userId}) async { + Future> getGrades({required String userId, required Map renamedSubjects}) async { List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); if (userData.isEmpty) return []; String? gradesJson = userData.elementAt(0)["grades"] as String?; if (gradesJson == null) return []; - List grades = (jsonDecode(gradesJson) as List).map((e) => Grade.fromJson(e)).toList(); + List grades = (jsonDecode(gradesJson) as List).map((e) => Grade.fromJson(e, renamedSubjects: renamedSubjects)).toList(); return grades; } - Future> getLessons({required String userId}) async { + Future> getLessons({required String userId, required Map renamedSubjects}) async { List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); if (userData.isEmpty) return []; String? lessonsJson = userData.elementAt(0)["timetable"] as String?; if (lessonsJson == null) return []; - List lessons = (jsonDecode(lessonsJson) as List).map((e) => Lesson.fromJson(e)).toList(); + List lessons = (jsonDecode(lessonsJson) as List).map((e) => Lesson.fromJson(e, renamedSubjects: renamedSubjects)).toList(); return lessons; } @@ -115,21 +115,21 @@ class UserDatabaseQuery { return events; } - Future> getAbsences({required String userId}) async { + Future> getAbsences({required String userId, required Map renamedSubjects}) async { List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); if (userData.isEmpty) return []; String? absencesJson = userData.elementAt(0)["absences"] as String?; if (absencesJson == null) return []; - List absences = (jsonDecode(absencesJson) as List).map((e) => Absence.fromJson(e)).toList(); + List absences = (jsonDecode(absencesJson) as List).map((e) => Absence.fromJson(e, renamedSubjects: renamedSubjects)).toList(); return absences; } - Future> getGroupAverages({required String userId}) async { + Future> getGroupAverages({required String userId, required Map renamedSubjects}) async { List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); if (userData.isEmpty) return []; String? groupAveragesJson = userData.elementAt(0)["group_averages"] as String?; if (groupAveragesJson == null) return []; - List groupAverages = (jsonDecode(groupAveragesJson) as List).map((e) => GroupAverage.fromJson(e)).toList(); + List groupAverages = (jsonDecode(groupAveragesJson) as List).map((e) => GroupAverage.fromJson(e, renamedSubjects: renamedSubjects)).toList(); return groupAverages; } @@ -150,4 +150,12 @@ class UserDatabaseQuery { DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate); return lastSeen; } + + Future> renamedSubjects({required String userId}) async { + List userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); + if (userData.isEmpty) return {}; + String? renamedSubjectsJson = userData.elementAt(0)["renamed_subjects"] as String?; + if (renamedSubjectsJson == null) return {}; + return (jsonDecode(renamedSubjectsJson) as Map).map((key, value) => MapEntry(key.toString(), value.toString())); + } } diff --git a/filcnaplo/lib/database/store.dart b/filcnaplo/lib/database/store.dart index 1046e7e..e97c369 100644 --- a/filcnaplo/lib/database/store.dart +++ b/filcnaplo/lib/database/store.dart @@ -100,4 +100,9 @@ class UserDatabaseStore { int lastSeenDate = date.millisecondsSinceEpoch; await db.update("user_data", {"last_seen_grade": lastSeenDate}, where: "id = ?", whereArgs: [userId]); } + + Future storeRenamedSubjects(Map subjects, {required String userId}) async { + String renamedSubjectsJson = jsonEncode(subjects); + await db.update("user_data", {"renamed_subjects": renamedSubjectsJson}, where: "id = ?", whereArgs: [userId]); + } } diff --git a/filcnaplo/lib/models/settings.dart b/filcnaplo/lib/models/settings.dart index b2ed265..66b8f2c 100644 --- a/filcnaplo/lib/models/settings.dart +++ b/filcnaplo/lib/models/settings.dart @@ -65,6 +65,7 @@ class SettingsProvider extends ChangeNotifier { List _premiumScopes; String _premiumAccessToken; String _lastAccountId; + bool _renamedSubjectsEnabled; SettingsProvider({ DatabaseProvider? database, @@ -99,6 +100,7 @@ class SettingsProvider extends ChangeNotifier { required List premiumScopes, required String premiumAccessToken, required String lastAccountId, + required bool renameSubjectsEnabled, }) : _database = database, _language = language, _startPage = startPage, @@ -130,7 +132,8 @@ class SettingsProvider extends ChangeNotifier { _customHighlightColor = customHighlightColor, _premiumScopes = premiumScopes, _premiumAccessToken = premiumAccessToken, - _lastAccountId = lastAccountId; + _lastAccountId = lastAccountId, + _renamedSubjectsEnabled = renameSubjectsEnabled; factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) { Map? configMap; @@ -180,6 +183,7 @@ class SettingsProvider extends ChangeNotifier { premiumScopes: jsonDecode(map["premium_scopes"]).cast(), premiumAccessToken: map["premium_token"], lastAccountId: map["last_account_id"], + renameSubjectsEnabled: map["renamed_subjects_enabled"] == 1, ); } @@ -219,6 +223,7 @@ class SettingsProvider extends ChangeNotifier { "premium_scopes": jsonEncode(_premiumScopes), "premium_token": _premiumAccessToken, "last_account_id": _lastAccountId, + "renamed_subjects_enabled": _renamedSubjectsEnabled ? 1 : 0 }; } @@ -262,6 +267,7 @@ class SettingsProvider extends ChangeNotifier { premiumScopes: [], premiumAccessToken: "", lastAccountId: "", + renameSubjectsEnabled: false, ); } @@ -297,6 +303,7 @@ class SettingsProvider extends ChangeNotifier { List get premiumScopes => _premiumScopes; String get premiumAccessToken => _premiumAccessToken; String get lastAccountId => _lastAccountId; + bool get renamedSubjectsEnabled => _renamedSubjectsEnabled; Future update({ bool store = true, @@ -331,6 +338,7 @@ class SettingsProvider extends ChangeNotifier { List? premiumScopes, String? premiumAccessToken, String? lastAccountId, + bool? renamedSubjectsEnabled, }) async { if (language != null && language != _language) _language = language; if (startPage != null && startPage != _startPage) _startPage = startPage; @@ -365,6 +373,7 @@ class SettingsProvider extends ChangeNotifier { if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes; if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken; if (lastAccountId != null && lastAccountId != _lastAccountId) _lastAccountId = lastAccountId; + if (renamedSubjectsEnabled != null && renamedSubjectsEnabled != _renamedSubjectsEnabled) _renamedSubjectsEnabled = renamedSubjectsEnabled; if (store) await _database?.store.storeSettings(this); notifyListeners(); diff --git a/filcnaplo/lib/ui/widgets/grade/grade_tile.dart b/filcnaplo/lib/ui/widgets/grade/grade_tile.dart index 392a4ce..f338572 100644 --- a/filcnaplo/lib/ui/widgets/grade/grade_tile.dart +++ b/filcnaplo/lib/ui/widgets/grade/grade_tile.dart @@ -23,7 +23,7 @@ class GradeTile extends StatelessWidget { String subtitle; EdgeInsets leadingPadding = EdgeInsets.zero; bool isSubjectView = SubjectGradesContainer.of(context) != null; - String subjectName = grade.subject.name.capital(); + String subjectName = grade.subject.renamedTo != null ? grade.subject.renamedTo! : grade.subject.name.capital(); String modeDescription = grade.mode.description.capital(); String description = grade.description.capital(); @@ -112,7 +112,7 @@ class GradeTile extends StatelessWidget { title, maxLines: 2, overflow: TextOverflow.ellipsis, - style: const TextStyle(fontWeight: FontWeight.w600), + style: TextStyle(fontWeight: FontWeight.w600, fontStyle: grade.subject.renamedTo != null ? FontStyle.italic : null), ), subtitle: subtitle != "" ? censored diff --git a/filcnaplo/lib/ui/widgets/lesson/lesson_tile.dart b/filcnaplo/lib/ui/widgets/lesson/lesson_tile.dart index 15049f1..7639271 100644 --- a/filcnaplo/lib/ui/widgets/lesson/lesson_tile.dart +++ b/filcnaplo/lib/ui/widgets/lesson/lesson_tile.dart @@ -133,14 +133,18 @@ class LessonTile extends StatelessWidget { contentPadding: const EdgeInsets.symmetric(horizontal: 4.0), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), title: Text( - !lesson.isEmpty ? lesson.subject.name.capital() : "empty".i18n, + !lesson.isEmpty + ? lesson.subject.renamedTo != null + ? lesson.subject.renamedTo! + : lesson.subject.name.capital() + : "empty".i18n, maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle( - fontWeight: FontWeight.w600, - fontSize: 15.5, - color: AppColors.of(context).text.withOpacity(!lesson.isEmpty ? 1.0 : 0.5), - ), + fontWeight: FontWeight.w600, + fontSize: 15.5, + color: AppColors.of(context).text.withOpacity(!lesson.isEmpty ? 1.0 : 0.5), + fontStyle: lesson.subject.renamedTo != null ? FontStyle.italic : null), ), subtitle: description != "" ? Text(