changed old subject type to gradesubject
This commit is contained in:
parent
c7c3b421f4
commit
2d5cbe8799
@ -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<SettingsProvider>(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<SettingsProvider>(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ó";
|
||||
|
@ -5,17 +5,21 @@ enum SubjectLessonCountUpdateState { ready, updating }
|
||||
|
||||
class SubjectLessonCount {
|
||||
DateTime lastUpdated;
|
||||
Map<Subject, int> subjects;
|
||||
Map<GradeSubject, int> 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,
|
||||
),
|
||||
),
|
||||
|
@ -31,7 +31,7 @@ import 'absences_page.i18n.dart';
|
||||
enum AbsenceFilter { absences, delays, misses }
|
||||
|
||||
class SubjectAbsence {
|
||||
Subject subject;
|
||||
GradeSubject subject;
|
||||
List<Absence> absences;
|
||||
double percentage;
|
||||
|
||||
@ -56,7 +56,7 @@ class _AbsencesPageState extends State<AbsencesPage>
|
||||
late String firstName;
|
||||
late TabController _tabController;
|
||||
late List<SubjectAbsence> absences = [];
|
||||
final Map<Subject, Lesson> _lessonCount = {};
|
||||
final Map<GradeSubject, Lesson> _lessonCount = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -87,7 +87,7 @@ class _AbsencesPageState extends State<AbsencesPage>
|
||||
}
|
||||
|
||||
void buildSubjectAbsences() {
|
||||
Map<Subject, SubjectAbsence> _absences = {};
|
||||
Map<GradeSubject, SubjectAbsence> _absences = {};
|
||||
|
||||
for (final absence in absenceProvider.absences) {
|
||||
if (absence.delay != 0) continue;
|
||||
|
@ -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<GradeSubjectView> {
|
||||
|
||||
bool gradeCalcMode = false;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject) => !gradeCalcMode
|
||||
List<Grade> getSubjectGrades(GradeSubject subject) => !gradeCalcMode
|
||||
? gradeProvider.grades.where((e) => e.subject == subject).toList()
|
||||
: calculatorProvider.grades.where((e) => e.subject == subject).toList();
|
||||
|
||||
|
@ -41,7 +41,7 @@ class _GradesPageState extends State<GradesPage> {
|
||||
|
||||
int avgDropValue = 0;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||
List<Grade> getSubjectGrades(GradeSubject subject, {int days = 0}) => gradeProvider
|
||||
.grades
|
||||
.where((e) =>
|
||||
e.subject == subject &&
|
||||
@ -51,14 +51,14 @@ class _GradesPageState extends State<GradesPage> {
|
||||
.toList();
|
||||
|
||||
void generateTiles() {
|
||||
List<Subject> subjects = gradeProvider.grades
|
||||
List<GradeSubject> subjects = gradeProvider.grades
|
||||
.map((e) => e.subject)
|
||||
.toSet()
|
||||
.toList()
|
||||
..sort((a, b) => a.name.compareTo(b.name));
|
||||
List<Widget> tiles = [];
|
||||
|
||||
Map<Subject, double> subjectAvgs = {};
|
||||
Map<GradeSubject, double> subjectAvgs = {};
|
||||
|
||||
tiles.addAll(subjects.map((subject) {
|
||||
List<Grade> subjectGrades = getSubjectGrades(subject);
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ class Homework {
|
||||
bool homeworkEnabled;
|
||||
Teacher teacher;
|
||||
String content;
|
||||
Subject subject;
|
||||
GradeSubject subject;
|
||||
String group;
|
||||
List<HomeworkAttachment> 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"] ?? ""
|
||||
: "",
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
165
filcnaplo_kreta_api/lib/providers/subject_provider.dart
Normal file
165
filcnaplo_kreta_api/lib/providers/subject_provider.dart
Normal file
@ -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<Grade> _grades;
|
||||
late DateTime _lastSeen;
|
||||
late String _groups;
|
||||
List<GroupAverage> _groupAvg = [];
|
||||
late final SettingsProvider _settings;
|
||||
late final UserProvider _user;
|
||||
late final DatabaseProvider _database;
|
||||
late final KretaClient _kreta;
|
||||
|
||||
// Public
|
||||
List<Grade> get grades => _grades;
|
||||
DateTime get lastSeenDate =>
|
||||
_settings.gradeOpeningFun ? _lastSeen : DateTime(3000);
|
||||
String get groups => _groups;
|
||||
List<GroupAverage> get groupAverages => _groupAvg;
|
||||
|
||||
SubjectProvider({
|
||||
List<Grade> 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<void> seenAll() async {
|
||||
String? userId = _user.id;
|
||||
if (userId != null) {
|
||||
final userStore = _database.userStore;
|
||||
userStore.storeLastSeenGrade(DateTime.now(), userId: userId);
|
||||
_lastSeen = DateTime.now();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> 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<void> convertBySettings() async {
|
||||
Map<String, String> renamedSubjects = _settings.renamedSubjectsEnabled
|
||||
? await _database.userQuery.renamedSubjects(userId: _user.user!.id)
|
||||
: {};
|
||||
Map<String, String> 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<void> 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<Grade> 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<void> store(List<Grade> 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<void> storeGroupAvg(List<GroupAverage> 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();
|
||||
}
|
||||
}
|
@ -35,12 +35,12 @@ class _PersonalityCardState extends State<PersonalityCard> {
|
||||
late SettingsProvider settings;
|
||||
|
||||
late List<int> subjectAvgsList = [];
|
||||
late Map<Subject, double> subjectAvgs = {};
|
||||
late Map<GradeSubject, double> subjectAvgs = {};
|
||||
late double subjectAvg;
|
||||
late List<Grade> classWorkGrades;
|
||||
late Map<int, int> mostCommonGrade;
|
||||
late List<Absence> absences = [];
|
||||
final Map<Subject, Lesson> _lessonCount = {};
|
||||
final Map<GradeSubject, Lesson> _lessonCount = {};
|
||||
late int totalDelays;
|
||||
late int unexcusedAbsences;
|
||||
|
||||
@ -48,13 +48,14 @@ class _PersonalityCardState extends State<PersonalityCard> {
|
||||
|
||||
bool hold = false;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||
.grades
|
||||
List<Grade> 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)))))
|
||||
e.date
|
||||
.isBefore(DateTime.now().subtract(Duration(days: days)))))
|
||||
.toList();
|
||||
|
||||
@override
|
||||
@ -89,13 +90,13 @@ class _PersonalityCardState extends State<PersonalityCard> {
|
||||
}
|
||||
|
||||
void getGrades() {
|
||||
List<Subject> subjects = gradeProvider.grades
|
||||
List<GradeSubject> 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<Grade> subjectGrades = getSubjectGrades(subject);
|
||||
|
||||
double avg = AverageHelper.averageEvals(subjectGrades);
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
|
@ -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<Absence> absences;
|
||||
|
||||
static void show(Subject subject, List<Absence> absences,
|
||||
static void show(GradeSubject subject, List<Absence> absences,
|
||||
{required BuildContext context}) {
|
||||
Navigator.of(context, rootNavigator: true)
|
||||
.push<Absence>(CupertinoPageRoute(
|
||||
|
@ -33,7 +33,7 @@ import 'absences_page.i18n.dart';
|
||||
enum AbsenceFilter { absences, delays, misses }
|
||||
|
||||
class SubjectAbsence {
|
||||
Subject subject;
|
||||
GradeSubject subject;
|
||||
List<Absence> absences;
|
||||
double percentage;
|
||||
|
||||
@ -58,7 +58,7 @@ class _AbsencesPageState extends State<AbsencesPage>
|
||||
late String firstName;
|
||||
late TabController _tabController;
|
||||
late List<SubjectAbsence> absences = [];
|
||||
final Map<Subject, Lesson> _lessonCount = {};
|
||||
final Map<GradeSubject, Lesson> _lessonCount = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -90,7 +90,7 @@ class _AbsencesPageState extends State<AbsencesPage>
|
||||
}
|
||||
|
||||
void buildSubjectAbsences() {
|
||||
Map<Subject, SubjectAbsence> _absences = {};
|
||||
Map<GradeSubject, SubjectAbsence> _absences = {};
|
||||
|
||||
for (final absence in absenceProvider.absences) {
|
||||
if (absence.delay != 0) continue;
|
||||
|
@ -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();
|
||||
|
@ -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<Subject, double> subjectAvgs;
|
||||
final Map<GradeSubject, double> subjectAvgs;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -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<GradeSubjectView> {
|
||||
|
||||
String plan = '';
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject) => !gradeCalcMode
|
||||
List<Grade> getSubjectGrades(GradeSubject subject) => !gradeCalcMode
|
||||
? gradeProvider.grades.where((e) => e.subject == subject).toList()
|
||||
: calculatorProvider.grades.where((e) => e.subject == subject).toList();
|
||||
|
||||
|
@ -48,24 +48,25 @@ class _GradesPageState extends State<GradesPage> {
|
||||
|
||||
int avgDropValue = 0;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||
.grades
|
||||
List<Grade> 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)))))
|
||||
e.date
|
||||
.isBefore(DateTime.now().subtract(Duration(days: days)))))
|
||||
.toList();
|
||||
|
||||
void generateTiles() {
|
||||
List<Subject> subjects = gradeProvider.grades
|
||||
List<GradeSubject> subjects = gradeProvider.grades
|
||||
.map((e) => e.subject)
|
||||
.toSet()
|
||||
.toList()
|
||||
..sort((a, b) => a.name.compareTo(b.name));
|
||||
List<Widget> tiles = [];
|
||||
|
||||
Map<Subject, double> subjectAvgs = {};
|
||||
Map<GradeSubject, double> subjectAvgs = {};
|
||||
|
||||
tiles.addAll(subjects.map((subject) {
|
||||
List<Grade> subjectGrades = getSubjectGrades(subject);
|
||||
|
@ -30,7 +30,7 @@ class _AllSumBodyState extends State<AllSumBody> {
|
||||
int avgDropValue = 0;
|
||||
bool animation = false;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||
List<Grade> getSubjectGrades(GradeSubject subject, {int days = 0}) => gradeProvider
|
||||
.grades
|
||||
.where((e) =>
|
||||
e.subject == subject &&
|
||||
|
@ -50,13 +50,14 @@ class _GradesBodyState extends State<GradesBody> {
|
||||
int avgDropValue = 0;
|
||||
bool animation = false;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
|
||||
.grades
|
||||
List<Grade> 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)))))
|
||||
e.date
|
||||
.isBefore(DateTime.now().subtract(Duration(days: days)))))
|
||||
.toList();
|
||||
|
||||
@override
|
||||
@ -74,18 +75,18 @@ class _GradesBodyState extends State<GradesBody> {
|
||||
}
|
||||
|
||||
void generateTiles({required int filter}) {
|
||||
List<Subject> subjects = gradeProvider.grades
|
||||
List<GradeSubject> subjects = gradeProvider.grades
|
||||
.map((e) => e.subject)
|
||||
.toSet()
|
||||
.toList()
|
||||
..sort((a, b) => a.name.compareTo(b.name));
|
||||
List<Widget> tiles = [];
|
||||
|
||||
Map<Subject, double> subjectAvgs = {};
|
||||
Map<GradeSubject, double> subjectAvgs = {};
|
||||
|
||||
var count = 1;
|
||||
|
||||
for (Subject subject in subjects) {
|
||||
for (GradeSubject subject in subjects) {
|
||||
List<Grade> subjectGrades = getSubjectGrades(subject);
|
||||
|
||||
double avg = AverageHelper.averageEvals(subjectGrades);
|
||||
|
@ -28,7 +28,7 @@ List<String> faces = [
|
||||
];
|
||||
|
||||
class SubjectAbsence {
|
||||
Subject subject;
|
||||
GradeSubject subject;
|
||||
List<Absence> absences;
|
||||
double percentage;
|
||||
|
||||
@ -52,7 +52,7 @@ class _LessonsBodyState extends State<LessonsBody> {
|
||||
late List<SubjectAbsence> absences = [];
|
||||
late List<Widget> lessons = [];
|
||||
late List<Absence> delays = [];
|
||||
final Map<Subject, Lesson> _lessonCount = {};
|
||||
final Map<GradeSubject, Lesson> _lessonCount = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -85,7 +85,7 @@ class _LessonsBodyState extends State<LessonsBody> {
|
||||
}
|
||||
|
||||
void buildSubjectAbsences() {
|
||||
Map<Subject, SubjectAbsence> _absences = {};
|
||||
Map<GradeSubject, SubjectAbsence> _absences = {};
|
||||
|
||||
for (final absence in absenceProvider.absences) {
|
||||
if (absence.delay != 0) continue;
|
||||
|
@ -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<Subject> subjects = gradeProvider.grades
|
||||
List<GradeSubject> subjects = gradeProvider.grades
|
||||
.map((e) => e.subject)
|
||||
.toSet()
|
||||
.toList()
|
||||
@ -45,7 +45,7 @@ class GoalProvider extends ChangeNotifier {
|
||||
_doneSubject = null;
|
||||
}
|
||||
|
||||
Future<void> clearGoal(Subject subject) async {
|
||||
Future<void> clearGoal(GradeSubject subject) async {
|
||||
final goalPlans = await _db.userQuery.subjectGoalPlans(userId: _user.id!);
|
||||
final goalAvgs = await _db.userQuery.subjectGoalAverages(userId: _user.id!);
|
||||
final goalBeforeGrades =
|
||||
|
@ -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<T?> show<T>(
|
||||
Subject subject, {
|
||||
GradeSubject subject, {
|
||||
required BuildContext context,
|
||||
}) async {
|
||||
UserProvider user = Provider.of<UserProvider>(context, listen: false);
|
||||
|
@ -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),
|
||||
|
@ -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<GoalPlannerScreen> {
|
||||
|
||||
bool gradeCalcMode = false;
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject) => !gradeCalcMode
|
||||
List<Grade> getSubjectGrades(GradeSubject subject) => !gradeCalcMode
|
||||
? gradeProvider.grades.where((e) => e.subject == subject).toList()
|
||||
: calculatorProvider.grades.where((e) => e.subject == subject).toList();
|
||||
|
||||
|
@ -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<GoalStateScreen> {
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
List<Grade> getSubjectGrades(Subject subject) =>
|
||||
List<Grade> getSubjectGrades(GradeSubject subject) =>
|
||||
gradeProvider.grades.where((e) => (e.subject == subject)).toList();
|
||||
|
||||
List<Grade> getAfterGoalGrades(Subject subject) => gradeProvider.grades
|
||||
List<Grade> getAfterGoalGrades(GradeSubject subject) => gradeProvider.grades
|
||||
.where((e) => (e.subject == subject && e.date.isAfter(goalPinDate)))
|
||||
.toList();
|
||||
|
||||
|
@ -91,7 +91,7 @@ class _ModifySubjectNamesState extends State<ModifySubjectNames> {
|
||||
final _subjectName = TextEditingController();
|
||||
String? selectedSubjectId;
|
||||
|
||||
late List<Subject> subjects;
|
||||
late List<GradeSubject> subjects;
|
||||
late UserProvider user;
|
||||
late DatabaseProvider dbProvider;
|
||||
late SettingsProvider settings;
|
||||
@ -295,8 +295,10 @@ class _ModifySubjectNamesState extends State<ModifySubjectNames> {
|
||||
Panel(
|
||||
child: SwitchListTile(
|
||||
title: Text("italics_toggle".i18n),
|
||||
onChanged: (value) => settings.update(renamedSubjectsItalics: value),
|
||||
value: settings.renamedSubjectsItalics,),
|
||||
onChanged: (value) =>
|
||||
settings.update(renamedSubjectsItalics: value),
|
||||
value: settings.renamedSubjectsItalics,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
@ -339,7 +341,7 @@ class _ModifySubjectNamesState extends State<ModifySubjectNames> {
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user