subjects rename

This commit is contained in:
ezyyeah 2022-12-31 00:45:10 +01:00
parent 35e5c9cdc6
commit 8bc695b70f
6 changed files with 47 additions and 17 deletions

View File

@ -16,7 +16,7 @@ const settingsDB = DatabaseStruct("settings", {
"vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int, "vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
"notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications "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, "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 // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING
// YOU'VE BEEN WARNED!!! // YOU'VE BEEN WARNED!!!
@ -27,6 +27,8 @@ const usersDB = DatabaseStruct("users", {
const userDataDB = DatabaseStruct("user_data", { const userDataDB = DatabaseStruct("user_data", {
"id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String, "id": String, "grades": String, "timetable": String, "exams": String, "homework": String, "messages": String, "notes": String,
"events": String, "absences": String, "group_averages": String, "events": String, "absences": String, "group_averages": String,
// renamed subjects // non kreta data
"renamed_subjects": String,
// "subject_lesson_count": String, // non kreta data // "subject_lesson_count": String, // non kreta data
"last_seen_grade": int, "last_seen_grade": int,
}); });
@ -67,6 +69,8 @@ Future<Database> initDB(DatabaseProvider database) async {
await migrateDB(db, struct: userDataDB, defaultValues: { await migrateDB(db, struct: userDataDB, defaultValues: {
"grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]", "grades": "[]", "timetable": "[]", "exams": "[]", "homework": "[]", "messages": "[]", "notes": "[]", "events": "[]", "absences": "[]",
"group_averages": "[]", "group_averages": "[]",
// renamed subjects // non kreta data
"renamed_subjects": "{}",
// "subject_lesson_count": "{}", // non kreta data // "subject_lesson_count": "{}", // non kreta data
"last_seen_grade": 0, "last_seen_grade": 0,
}); });

View File

@ -52,21 +52,21 @@ class UserDatabaseQuery {
final Database db; final Database db;
Future<List<Grade>> getGrades({required String userId}) async { Future<List<Grade>> getGrades({required String userId, required Map<String, String> renamedSubjects}) async {
List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return []; if (userData.isEmpty) return [];
String? gradesJson = userData.elementAt(0)["grades"] as String?; String? gradesJson = userData.elementAt(0)["grades"] as String?;
if (gradesJson == null) return []; if (gradesJson == null) return [];
List<Grade> grades = (jsonDecode(gradesJson) as List).map((e) => Grade.fromJson(e)).toList(); List<Grade> grades = (jsonDecode(gradesJson) as List).map((e) => Grade.fromJson(e, renamedSubjects: renamedSubjects)).toList();
return grades; return grades;
} }
Future<List<Lesson>> getLessons({required String userId}) async { Future<List<Lesson>> getLessons({required String userId, required Map<String, String> renamedSubjects}) async {
List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return []; if (userData.isEmpty) return [];
String? lessonsJson = userData.elementAt(0)["timetable"] as String?; String? lessonsJson = userData.elementAt(0)["timetable"] as String?;
if (lessonsJson == null) return []; if (lessonsJson == null) return [];
List<Lesson> lessons = (jsonDecode(lessonsJson) as List).map((e) => Lesson.fromJson(e)).toList(); List<Lesson> lessons = (jsonDecode(lessonsJson) as List).map((e) => Lesson.fromJson(e, renamedSubjects: renamedSubjects)).toList();
return lessons; return lessons;
} }
@ -115,21 +115,21 @@ class UserDatabaseQuery {
return events; return events;
} }
Future<List<Absence>> getAbsences({required String userId}) async { Future<List<Absence>> getAbsences({required String userId, required Map<String, String> renamedSubjects}) async {
List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return []; if (userData.isEmpty) return [];
String? absencesJson = userData.elementAt(0)["absences"] as String?; String? absencesJson = userData.elementAt(0)["absences"] as String?;
if (absencesJson == null) return []; if (absencesJson == null) return [];
List<Absence> absences = (jsonDecode(absencesJson) as List).map((e) => Absence.fromJson(e)).toList(); List<Absence> absences = (jsonDecode(absencesJson) as List).map((e) => Absence.fromJson(e, renamedSubjects: renamedSubjects)).toList();
return absences; return absences;
} }
Future<List<GroupAverage>> getGroupAverages({required String userId}) async { Future<List<GroupAverage>> getGroupAverages({required String userId, required Map<String, String> renamedSubjects}) async {
List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]); List<Map> userData = await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return []; if (userData.isEmpty) return [];
String? groupAveragesJson = userData.elementAt(0)["group_averages"] as String?; String? groupAveragesJson = userData.elementAt(0)["group_averages"] as String?;
if (groupAveragesJson == null) return []; if (groupAveragesJson == null) return [];
List<GroupAverage> groupAverages = (jsonDecode(groupAveragesJson) as List).map((e) => GroupAverage.fromJson(e)).toList(); List<GroupAverage> groupAverages = (jsonDecode(groupAveragesJson) as List).map((e) => GroupAverage.fromJson(e, renamedSubjects: renamedSubjects)).toList();
return groupAverages; return groupAverages;
} }
@ -150,4 +150,12 @@ class UserDatabaseQuery {
DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate); DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate);
return lastSeen; return lastSeen;
} }
Future<Map<String, String>> renamedSubjects({required String userId}) async {
List<Map> 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()));
}
} }

View File

@ -100,4 +100,9 @@ class UserDatabaseStore {
int lastSeenDate = date.millisecondsSinceEpoch; int lastSeenDate = date.millisecondsSinceEpoch;
await db.update("user_data", {"last_seen_grade": lastSeenDate}, where: "id = ?", whereArgs: [userId]); await db.update("user_data", {"last_seen_grade": lastSeenDate}, where: "id = ?", whereArgs: [userId]);
} }
Future<void> storeRenamedSubjects(Map<String, String> subjects, {required String userId}) async {
String renamedSubjectsJson = jsonEncode(subjects);
await db.update("user_data", {"renamed_subjects": renamedSubjectsJson}, where: "id = ?", whereArgs: [userId]);
}
} }

View File

@ -65,6 +65,7 @@ class SettingsProvider extends ChangeNotifier {
List<String> _premiumScopes; List<String> _premiumScopes;
String _premiumAccessToken; String _premiumAccessToken;
String _lastAccountId; String _lastAccountId;
bool _renamedSubjectsEnabled;
SettingsProvider({ SettingsProvider({
DatabaseProvider? database, DatabaseProvider? database,
@ -99,6 +100,7 @@ class SettingsProvider extends ChangeNotifier {
required List<String> premiumScopes, required List<String> premiumScopes,
required String premiumAccessToken, required String premiumAccessToken,
required String lastAccountId, required String lastAccountId,
required bool renameSubjectsEnabled,
}) : _database = database, }) : _database = database,
_language = language, _language = language,
_startPage = startPage, _startPage = startPage,
@ -130,7 +132,8 @@ class SettingsProvider extends ChangeNotifier {
_customHighlightColor = customHighlightColor, _customHighlightColor = customHighlightColor,
_premiumScopes = premiumScopes, _premiumScopes = premiumScopes,
_premiumAccessToken = premiumAccessToken, _premiumAccessToken = premiumAccessToken,
_lastAccountId = lastAccountId; _lastAccountId = lastAccountId,
_renamedSubjectsEnabled = renameSubjectsEnabled;
factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) { factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) {
Map<String, Object?>? configMap; Map<String, Object?>? configMap;
@ -180,6 +183,7 @@ class SettingsProvider extends ChangeNotifier {
premiumScopes: jsonDecode(map["premium_scopes"]).cast<String>(), premiumScopes: jsonDecode(map["premium_scopes"]).cast<String>(),
premiumAccessToken: map["premium_token"], premiumAccessToken: map["premium_token"],
lastAccountId: map["last_account_id"], lastAccountId: map["last_account_id"],
renameSubjectsEnabled: map["renamed_subjects_enabled"] == 1,
); );
} }
@ -219,6 +223,7 @@ class SettingsProvider extends ChangeNotifier {
"premium_scopes": jsonEncode(_premiumScopes), "premium_scopes": jsonEncode(_premiumScopes),
"premium_token": _premiumAccessToken, "premium_token": _premiumAccessToken,
"last_account_id": _lastAccountId, "last_account_id": _lastAccountId,
"renamed_subjects_enabled": _renamedSubjectsEnabled ? 1 : 0
}; };
} }
@ -262,6 +267,7 @@ class SettingsProvider extends ChangeNotifier {
premiumScopes: [], premiumScopes: [],
premiumAccessToken: "", premiumAccessToken: "",
lastAccountId: "", lastAccountId: "",
renameSubjectsEnabled: false,
); );
} }
@ -297,6 +303,7 @@ class SettingsProvider extends ChangeNotifier {
List<String> get premiumScopes => _premiumScopes; List<String> get premiumScopes => _premiumScopes;
String get premiumAccessToken => _premiumAccessToken; String get premiumAccessToken => _premiumAccessToken;
String get lastAccountId => _lastAccountId; String get lastAccountId => _lastAccountId;
bool get renamedSubjectsEnabled => _renamedSubjectsEnabled;
Future<void> update({ Future<void> update({
bool store = true, bool store = true,
@ -331,6 +338,7 @@ class SettingsProvider extends ChangeNotifier {
List<String>? premiumScopes, List<String>? premiumScopes,
String? premiumAccessToken, String? premiumAccessToken,
String? lastAccountId, String? lastAccountId,
bool? renamedSubjectsEnabled,
}) async { }) async {
if (language != null && language != _language) _language = language; if (language != null && language != _language) _language = language;
if (startPage != null && startPage != _startPage) _startPage = startPage; if (startPage != null && startPage != _startPage) _startPage = startPage;
@ -365,6 +373,7 @@ class SettingsProvider extends ChangeNotifier {
if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes; if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes;
if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken; if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken;
if (lastAccountId != null && lastAccountId != _lastAccountId) _lastAccountId = lastAccountId; if (lastAccountId != null && lastAccountId != _lastAccountId) _lastAccountId = lastAccountId;
if (renamedSubjectsEnabled != null && renamedSubjectsEnabled != _renamedSubjectsEnabled) _renamedSubjectsEnabled = renamedSubjectsEnabled;
if (store) await _database?.store.storeSettings(this); if (store) await _database?.store.storeSettings(this);
notifyListeners(); notifyListeners();

View File

@ -23,7 +23,7 @@ class GradeTile extends StatelessWidget {
String subtitle; String subtitle;
EdgeInsets leadingPadding = EdgeInsets.zero; EdgeInsets leadingPadding = EdgeInsets.zero;
bool isSubjectView = SubjectGradesContainer.of(context) != null; 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 modeDescription = grade.mode.description.capital();
String description = grade.description.capital(); String description = grade.description.capital();
@ -112,7 +112,7 @@ class GradeTile extends StatelessWidget {
title, title,
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: const TextStyle(fontWeight: FontWeight.w600), style: TextStyle(fontWeight: FontWeight.w600, fontStyle: grade.subject.renamedTo != null ? FontStyle.italic : null),
), ),
subtitle: subtitle != "" subtitle: subtitle != ""
? censored ? censored

View File

@ -133,14 +133,18 @@ class LessonTile extends StatelessWidget {
contentPadding: const EdgeInsets.symmetric(horizontal: 4.0), contentPadding: const EdgeInsets.symmetric(horizontal: 4.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
title: Text( 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, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 15.5, fontSize: 15.5,
color: AppColors.of(context).text.withOpacity(!lesson.isEmpty ? 1.0 : 0.5), color: AppColors.of(context).text.withOpacity(!lesson.isEmpty ? 1.0 : 0.5),
), fontStyle: lesson.subject.renamedTo != null ? FontStyle.italic : null),
), ),
subtitle: description != "" subtitle: description != ""
? Text( ? Text(