diff --git a/lib/interface/cupertino/pages/grades.dart b/lib/interface/cupertino/pages/grades.dart index 1405ad8..1745ce0 100644 --- a/lib/interface/cupertino/pages/grades.dart +++ b/lib/interface/cupertino/pages/grades.dart @@ -65,7 +65,7 @@ class _GradesPageState extends State { .orderBy((x) => x.name) .toList(); - var hasSecondSemester = subjectsToDisplay.any((x) => x.grades.any((y) => y.semester == 2)); + var hasSecondSemester = subjectsToDisplay.any((x) => x.allGrades.any((y) => y.semester == 2)); var subjectsWidget = CupertinoListSection.insetGrouped( margin: EdgeInsets.only(left: 15, right: 15, bottom: 10), additionalDividerMargin: 5, @@ -84,7 +84,7 @@ class _GradesPageState extends State { ] // Bindable messages layout : subjectsToDisplay.select((x, index) { - var grades = x.grades.where((x) => x.semester == 2).appendAllIfEmpty(x.grades); + var grades = x.allGrades.where((x) => x.semester == 2).appendAllIfEmpty(x.allGrades); return Builder( builder: (context) => CupertinoListTile( diff --git a/lib/interface/cupertino/pages/home.dart b/lib/interface/cupertino/pages/home.dart index 95652aa..0c3a878 100644 --- a/lib/interface/cupertino/pages/home.dart +++ b/lib/interface/cupertino/pages/home.dart @@ -100,10 +100,10 @@ class _HomePageState extends VisibilityAwareState { // Event list for the next week (7 days), exc homeworks and teacher absences var gradesWeek = Share.session.data.student.subjects - .where((x) => x.grades.isNotEmpty) + .where((x) => x.allGrades.isNotEmpty) .select((x, index) => ( lesson: x, - grades: x.grades.where((y) => y.addDate.isAfter(DateTime.now().subtract(Duration(days: 7)).asDate())).toList() + grades: x.allGrades.where((y) => y.addDate.isAfter(DateTime.now().subtract(Duration(days: 7)).asDate())).toList() )) .where((x) => x.grades.isNotEmpty) .orderByDescending((x) => x.grades.orderByDescending((y) => y.addDate).first.addDate) @@ -1097,7 +1097,7 @@ class _HomePageState extends VisibilityAwareState { title: y.value.asGrade(context, setState, markModified: y.type == RegisterChangeTypes.changed, onTap: () { var lesson = Share.session.data.student.subjects - .firstWhereOrDefault((value) => value.grades.contains(y.value)); + .firstWhereOrDefault((value) => value.allGrades.contains(y.value)); if (lesson == null) return; Share.tabsNavigatePage.broadcast(Value(1)); Future.delayed(Duration(milliseconds: 250)) diff --git a/lib/interface/cupertino/views/grades_detailed.dart b/lib/interface/cupertino/views/grades_detailed.dart index 97c0ed6..b2b4f43 100644 --- a/lib/interface/cupertino/views/grades_detailed.dart +++ b/lib/interface/cupertino/views/grades_detailed.dart @@ -33,9 +33,9 @@ class _GradesDetailedPageState extends State { @override Widget build(BuildContext context) { - var gradesToDisplay = widget.lesson.grades + var gradesToDisplay = widget.lesson.allGrades .where((x) => x.semester == 2) - .appendAllIfEmpty(widget.lesson.grades) + .appendAllIfEmpty(widget.lesson.allGrades) .where((x) => !x.major) .where((x) => x.name.contains(RegExp(searchQuery, caseSensitive: false)) || @@ -46,7 +46,7 @@ class _GradesDetailedPageState extends State { .distinct((x) => mapPropsToHashCode([x.resitPart ? 0 : UniqueKey(), x.name])) .toList(); - var secondSemester = widget.lesson.grades.any((x) => x.semester == 2 || x.isFinal || x.isFinalProposition); + var secondSemester = widget.lesson.allGrades.any((x) => x.semester == 2 || x.isFinal || x.isFinalProposition); var gradesWidget = CupertinoListSection.insetGrouped( margin: EdgeInsets.only(left: 15, right: 15, bottom: 10), additionalDividerMargin: 5, @@ -68,7 +68,7 @@ class _GradesDetailedPageState extends State { return CupertinoListTile( padding: EdgeInsets.all(0), title: x.asGrade(context, setState, - corrected: widget.lesson.grades.firstWhereOrDefault( + corrected: widget.lesson.allGrades.firstWhereOrDefault( (y) => x.resitPart && y.resitPart && y.name == x.name && x != y, defaultValue: null))); }).toList(), @@ -210,7 +210,7 @@ class _GradesDetailedPageState extends State { ]; // Proposed grade (2nd semester / year) - if (widget.lesson.grades + if (widget.lesson.allGrades .firstWhereOrDefault((x) => x.isFinalProposition || (x.isSemesterProposition && x.semester == 2)) ?.value != null) { @@ -222,7 +222,7 @@ class _GradesDetailedPageState extends State { CupertinoContextMenuAction( onPressed: () { sharing.Share.share( - 'I got a ${widget.lesson.grades.firstWhereOrDefault((x) => x.isFinalProposition || (x.semester == 2 && x.isSemesterProposition))?.value} proposition from ${widget.lesson.name}!'); + 'I got a ${widget.lesson.allGrades.firstWhereOrDefault((x) => x.isFinalProposition || (x.semester == 2 && x.isSemesterProposition))?.value} proposition from ${widget.lesson.name}!'); Navigator.of(context, rootNavigator: true).pop(); }, trailingIcon: CupertinoIcons.share, @@ -267,10 +267,10 @@ class _GradesDetailedPageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ UnreadDot( - unseen: () => widget.lesson.grades.any((x) => + unseen: () => widget.lesson.allGrades.any((x) => (x.isFinalProposition || (x.semester == 2 && x.isSemesterProposition)) && x.unseen), - markAsSeen: () => widget.lesson.grades + markAsSeen: () => widget.lesson.allGrades .where( (x) => x.isFinalProposition || (x.semester == 2 && x.isSemesterProposition)) .forEach((x) => x.markAsSeen()), @@ -281,7 +281,7 @@ class _GradesDetailedPageState extends State { ), ]), Text( - widget.lesson.grades + widget.lesson.allGrades .firstWhereOrDefault( (x) => x.isFinalProposition || (x.semester == 2 && x.isSemesterProposition)) ?.value @@ -294,7 +294,7 @@ class _GradesDetailedPageState extends State { } // Proposed grade (1st semester) - if (widget.lesson.grades.firstWhereOrDefault((x) => x.isSemesterProposition && x.semester == 1)?.value != null) { + if (widget.lesson.allGrades.firstWhereOrDefault((x) => x.isSemesterProposition && x.semester == 1)?.value != null) { gradesSemesterBottomWidgets.add(CupertinoListTile( padding: EdgeInsets.all(0), title: CupertinoContextMenu.builder( @@ -303,7 +303,7 @@ class _GradesDetailedPageState extends State { CupertinoContextMenuAction( onPressed: () { sharing.Share.share( - 'I got a ${widget.lesson.grades.firstWhereOrDefault((x) => x.isSemesterProposition && x.semester == 1)?.value} semester proposition from ${widget.lesson.name}!'); + 'I got a ${widget.lesson.allGrades.firstWhereOrDefault((x) => x.isSemesterProposition && x.semester == 1)?.value} semester proposition from ${widget.lesson.name}!'); Navigator.of(context, rootNavigator: true).pop(); }, trailingIcon: CupertinoIcons.share, @@ -348,9 +348,9 @@ class _GradesDetailedPageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ UnreadDot( - unseen: () => widget.lesson.grades + unseen: () => widget.lesson.allGrades .any((x) => (x.isSemesterProposition && x.semester == 1) && x.unseen), - markAsSeen: () => widget.lesson.grades + markAsSeen: () => widget.lesson.allGrades .where((x) => x.isSemesterProposition && x.semester == 1) .forEach((x) => x.markAsSeen()), margin: EdgeInsets.only(right: 8)), @@ -360,7 +360,7 @@ class _GradesDetailedPageState extends State { ), ]), Text( - widget.lesson.grades + widget.lesson.allGrades .firstWhereOrDefault((x) => x.isSemesterProposition && x.semester == 1) ?.value .toString() ?? @@ -372,7 +372,7 @@ class _GradesDetailedPageState extends State { } // Final grade (2nd semester / year) - if (widget.lesson.grades.firstWhereOrDefault((x) => x.isFinal || (x.isSemester && x.semester == 2))?.value != null) { + if (widget.lesson.allGrades.firstWhereOrDefault((x) => x.isFinal || (x.isSemester && x.semester == 2))?.value != null) { gradesBottomWidgets.add(CupertinoListTile( padding: EdgeInsets.all(0), title: CupertinoContextMenu.builder( @@ -381,7 +381,7 @@ class _GradesDetailedPageState extends State { CupertinoContextMenuAction( onPressed: () { sharing.Share.share( - 'I got a ${widget.lesson.grades.firstWhereOrDefault((x) => x.isFinal || (x.semester == 2 && x.isSemester))?.value} final from ${widget.lesson.name}!'); + 'I got a ${widget.lesson.allGrades.firstWhereOrDefault((x) => x.isFinal || (x.semester == 2 && x.isSemester))?.value} final from ${widget.lesson.name}!'); Navigator.of(context, rootNavigator: true).pop(); }, trailingIcon: CupertinoIcons.share, @@ -426,9 +426,9 @@ class _GradesDetailedPageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ UnreadDot( - unseen: () => widget.lesson.grades + unseen: () => widget.lesson.allGrades .any((x) => (x.isFinal || (x.semester == 2 && x.isSemester)) && x.unseen), - markAsSeen: () => widget.lesson.grades + markAsSeen: () => widget.lesson.allGrades .where((x) => x.isFinal || (x.semester == 2 && x.isSemester)) .forEach((x) => x.markAsSeen()), margin: EdgeInsets.only(right: 8)), @@ -438,7 +438,7 @@ class _GradesDetailedPageState extends State { ), ]), Text( - widget.lesson.grades + widget.lesson.allGrades .firstWhereOrDefault((x) => x.isFinal || (x.semester == 2 && x.isSemester)) ?.value .toString() ?? @@ -450,7 +450,7 @@ class _GradesDetailedPageState extends State { } // Final grade (1st semester) - if (widget.lesson.grades.firstWhereOrDefault((x) => x.isSemester && x.semester == 1)?.value != null) { + if (widget.lesson.allGrades.firstWhereOrDefault((x) => x.isSemester && x.semester == 1)?.value != null) { gradesSemesterBottomWidgets.add(CupertinoListTile( padding: EdgeInsets.all(0), title: CupertinoContextMenu.builder( @@ -459,7 +459,7 @@ class _GradesDetailedPageState extends State { CupertinoContextMenuAction( onPressed: () { sharing.Share.share( - 'I got a ${widget.lesson.grades.firstWhereOrDefault((x) => x.isSemester && x.semester == 1)?.value} semester from ${widget.lesson.name}!'); + 'I got a ${widget.lesson.allGrades.firstWhereOrDefault((x) => x.isSemester && x.semester == 1)?.value} semester from ${widget.lesson.name}!'); Navigator.of(context, rootNavigator: true).pop(); }, trailingIcon: CupertinoIcons.share, @@ -505,8 +505,8 @@ class _GradesDetailedPageState extends State { children: [ UnreadDot( unseen: () => - widget.lesson.grades.any((x) => (x.isSemester && x.semester == 1) && x.unseen), - markAsSeen: () => widget.lesson.grades + widget.lesson.allGrades.any((x) => (x.isSemester && x.semester == 1) && x.unseen), + markAsSeen: () => widget.lesson.allGrades .where((x) => x.isSemester && x.semester == 1) .forEach((x) => x.markAsSeen()), margin: EdgeInsets.only(right: 8)), @@ -516,7 +516,7 @@ class _GradesDetailedPageState extends State { ), ]), Text( - widget.lesson.grades + widget.lesson.allGrades .firstWhereOrDefault((x) => x.isSemester && x.semester == 1) ?.value .toString() ?? @@ -604,21 +604,23 @@ extension GradeBodyExtension on Grade { }, ), isOwnGrade) - .append(CupertinoContextMenuAction( - isDestructiveAction: true, - trailingIcon: CupertinoIcons.chat_bubble_2, - child: const Text('Inquiry'), - onPressed: () { - Navigator.of(context, rootNavigator: true).pop(); - showCupertinoModalBottomSheet( - context: context, - builder: (context) => MessageComposePage( - receivers: [addedBy], - subject: 'Pytanie o ocenÄ™ $value z dnia ${DateFormat("y.M.d").format(addDate)}', - signature: - '${Share.session.data.student.account.name}, ${Share.session.data.student.mainClass.name}')); - }, - )) + .appendIf( + CupertinoContextMenuAction( + isDestructiveAction: true, + trailingIcon: CupertinoIcons.chat_bubble_2, + child: const Text('Inquiry'), + onPressed: () { + Navigator.of(context, rootNavigator: true).pop(); + showCupertinoModalBottomSheet( + context: context, + builder: (context) => MessageComposePage( + receivers: [addedBy], + subject: 'Pytanie o ocenÄ™ $value z dnia ${DateFormat("y.M.d").format(addDate)}', + signature: + '${Share.session.data.student.account.name}, ${Share.session.data.student.mainClass.name}')); + }, + ), + !isOwnGrade) .appendIf( CupertinoContextMenuAction( isDestructiveAction: true, diff --git a/lib/models/data/lesson.dart b/lib/models/data/lesson.dart index 0dde3e2..441a73a 100644 --- a/lib/models/data/lesson.dart +++ b/lib/models/data/lesson.dart @@ -28,7 +28,7 @@ class Lesson extends Equatable { List? grades, }) : hostClass = hostClass ?? Class(), teacher = teacher ?? Teacher(), - _grades = grades ?? []; + grades = grades ?? []; @HiveField(1) final int id; @@ -58,25 +58,25 @@ class Lesson extends Equatable { final Teacher teacher; @HiveField(10) - final List _grades; + final List grades; @JsonKey(includeToJson: false, includeFromJson: false) - List get grades => _grades + List get allGrades => grades .appendAll(Share.session.customGrades.containsKey(this) ? (Share.session.customGrades[this] ?? []) : []) .toList(); @JsonKey(includeToJson: false, includeFromJson: false) - Iterable get gradesFirstSemester => grades.where((element) => element.semester == 1); + Iterable get gradesFirstSemester => allGrades.where((element) => element.semester == 1); @JsonKey(includeToJson: false, includeFromJson: false) - Iterable get gradesSecondSemester => grades.where((element) => element.semester == 2); + Iterable get gradesSecondSemester => allGrades.where((element) => element.semester == 2); @JsonKey(includeToJson: false, includeFromJson: false) Iterable get gradesCurrentSemester => DateTime.now().getDateOnly().isBefore(hostClass.endFirstSemester) ? gradesFirstSemester : gradesSecondSemester; @JsonKey(includeToJson: false, includeFromJson: false) - bool get hasGrades => grades.isNotEmpty; + bool get hasGrades => allGrades.isNotEmpty; @JsonKey(includeToJson: false, includeFromJson: false) bool get hasGradesCurrentSemester => gradesCurrentSemester.isNotEmpty; @@ -85,30 +85,30 @@ class Lesson extends Equatable { String get nameExtra => name + (isExtracurricular ? '*' : ''); @JsonKey(includeToJson: false, includeFromJson: false) - double get gradesAverage => grades + double get gradesAverage => allGrades .where((x) => x.countsToAverage && x.asValue >= 0) .toList() .gadesAverage(weighted: Share.session.settings.weightedAverage, adapt: Share.session.settings.autoArithmeticAverage); @JsonKey(includeToJson: false, includeFromJson: false) - double get gradesSemAverage => grades + double get gradesSemAverage => allGrades .where((x) => x.countsToAverage && x.asValue >= 0 && x.semester == 1) .toList() .gadesAverage(weighted: Share.session.settings.weightedAverage, adapt: Share.session.settings.autoArithmeticAverage); @JsonKey(includeToJson: false, includeFromJson: false) - bool get hasUnseen => grades.any((x) => x.unseen); + bool get hasUnseen => allGrades.any((x) => x.unseen); @JsonKey(includeToJson: false, includeFromJson: false) bool get hasMajor => topMajor != null; @JsonKey(includeToJson: false, includeFromJson: false) - Grade? get topMajor => grades.any((x) => x.semester > 1) - ? (grades.firstWhereOrDefault((x) => x.isFinal) ?? grades.firstWhereOrDefault((x) => x.isFinalProposition)) - : (grades.firstWhereOrDefault((x) => x.isSemester) ?? grades.firstWhereOrDefault((x) => x.isSemesterProposition)); + Grade? get topMajor => allGrades.any((x) => x.semester > 1) + ? (allGrades.firstWhereOrDefault((x) => x.isFinal) ?? allGrades.firstWhereOrDefault((x) => x.isFinalProposition)) + : (allGrades.firstWhereOrDefault((x) => x.isSemester) ?? allGrades.firstWhereOrDefault((x) => x.isSemesterProposition)); @JsonKey(includeToJson: false, includeFromJson: false) - int get unseenCount => grades.count((x) => x.unseen); + int get unseenCount => allGrades.count((x) => x.unseen); @override List get props => [ diff --git a/lib/models/data/lesson.g.dart b/lib/models/data/lesson.g.dart index a532b77..47dde91 100644 --- a/lib/models/data/lesson.g.dart +++ b/lib/models/data/lesson.g.dart @@ -26,6 +26,7 @@ class LessonAdapter extends TypeAdapter { isBlockLesson: fields[7] as bool, hostClass: fields[8] as Class?, teacher: fields[9] as Teacher?, + grades: (fields[10] as List?)?.cast(), ); } @@ -52,7 +53,7 @@ class LessonAdapter extends TypeAdapter { ..writeByte(9) ..write(obj.teacher) ..writeByte(10) - ..write(obj._grades); + ..write(obj.grades); } @override @@ -84,6 +85,9 @@ Lesson _$LessonFromJson(Map json) => Lesson( teacher: json['teacher'] == null ? null : Teacher.fromJson(json['teacher'] as Map), + grades: (json['grades'] as List?) + ?.map((e) => Grade.fromJson(e as Map)) + .toList(), ); Map _$LessonToJson(Lesson instance) => { @@ -96,4 +100,5 @@ Map _$LessonToJson(Lesson instance) => { 'isBlockLesson': instance.isBlockLesson, 'hostClass': instance.hostClass, 'teacher': instance.teacher, + 'grades': instance.grades, };