half-working total average calculator done :3

This commit is contained in:
Kima 2023-11-19 23:21:10 +01:00
parent ebf9c8526d
commit aba39505d9
3 changed files with 102 additions and 22 deletions

View File

@ -14,7 +14,7 @@
android:resource="@style/NormalTheme" /> android:resource="@style/NormalTheme" />
<intent-filter> <intent-filter>
<!-- commented bc of dynamic app icons --> <!-- commented bc of dynamic app icons -->
<!-- <action android:name="android.intent.action.MAIN" /> --> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter android:autoVerify="true"> <intent-filter android:autoVerify="true">

View File

@ -16,7 +16,7 @@ import 'grade_calculator.i18n.dart';
class GradeCalculator extends StatefulWidget { class GradeCalculator extends StatefulWidget {
const GradeCalculator(this.subject, {Key? key}) : super(key: key); const GradeCalculator(this.subject, {Key? key}) : super(key: key);
final GradeSubject subject; final GradeSubject? subject;
@override @override
_GradeCalculatorState createState() => _GradeCalculatorState(); _GradeCalculatorState createState() => _GradeCalculatorState();
@ -142,7 +142,8 @@ class _GradeCalculatorState extends State<GradeCalculator> {
List<Grade> grades = calculatorProvider.grades List<Grade> grades = calculatorProvider.grades
.where((e) => .where((e) =>
e.type == GradeType.midYear && e.type == GradeType.midYear &&
e.subject == widget.subject) (e.subject == widget.subject ||
widget.subject == null))
.toList(); .toList();
grades.sort((a, b) => -a.writeDate.compareTo(b.writeDate)); grades.sort((a, b) => -a.writeDate.compareTo(b.writeDate));
date = grades.first.date; date = grades.first.date;
@ -158,7 +159,12 @@ class _GradeCalculatorState extends State<GradeCalculator> {
teacher: Teacher.fromString("Ghost"), teacher: Teacher.fromString("Ghost"),
type: GradeType.ghost, type: GradeType.ghost,
form: "", form: "",
subject: widget.subject, subject: widget.subject ??
GradeSubject(
id: randomId(),
category: Category(id: randomId()),
name: 'All',
),
mode: Category.fromJson({}), mode: Category.fromJson({}),
seenDate: DateTime(0), seenDate: DateTime(0),
groupId: "", groupId: "",

View File

@ -11,6 +11,7 @@ import 'package:filcnaplo_kreta_api/models/grade.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:filcnaplo_kreta_api/models/group_average.dart'; import 'package:filcnaplo_kreta_api/models/group_average.dart';
import 'package:filcnaplo_mobile_ui/common/average_display.dart'; import 'package:filcnaplo_mobile_ui/common/average_display.dart';
import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
import 'package:filcnaplo_mobile_ui/common/empty.dart'; import 'package:filcnaplo_mobile_ui/common/empty.dart';
import 'package:filcnaplo_mobile_ui/common/panel/panel.dart'; import 'package:filcnaplo_mobile_ui/common/panel/panel.dart';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart'; import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart';
@ -24,10 +25,13 @@ import 'package:filcnaplo_mobile_ui/pages/grades/graph.dart';
import 'package:filcnaplo_mobile_ui/pages/grades/grade_subject_view.dart'; import 'package:filcnaplo_mobile_ui/pages/grades/grade_subject_view.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart'; import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:filcnaplo/helpers/average_helper.dart'; import 'package:filcnaplo/helpers/average_helper.dart';
import 'average_selector.dart'; import 'average_selector.dart';
import 'package:filcnaplo_premium/ui/mobile/premium/premium_inline.dart'; import 'package:filcnaplo_premium/ui/mobile/premium/premium_inline.dart';
import 'calculator/grade_calculator.dart';
import 'calculator/grade_calculator_provider.dart';
import 'grades_page.i18n.dart'; import 'grades_page.i18n.dart';
class GradesPage extends StatefulWidget { class GradesPage extends StatefulWidget {
@ -38,9 +42,14 @@ class GradesPage extends StatefulWidget {
} }
class _GradesPageState extends State<GradesPage> { class _GradesPageState extends State<GradesPage> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
PersistentBottomSheetController? _sheetController;
late UserProvider user; late UserProvider user;
late GradeProvider gradeProvider; late GradeProvider gradeProvider;
late UpdateProvider updateProvider; late UpdateProvider updateProvider;
late GradeCalculatorProvider calculatorProvider;
late String firstName; late String firstName;
late Widget yearlyGraph; late Widget yearlyGraph;
late Widget gradesCount; late Widget gradesCount;
@ -48,15 +57,26 @@ class _GradesPageState extends State<GradesPage> {
int avgDropValue = 0; int avgDropValue = 0;
List<Grade> getSubjectGrades(GradeSubject subject, {int days = 0}) => bool gradeCalcMode = false;
gradeProvider.grades
.where((e) => List<Grade> getSubjectGrades(GradeSubject subject,
e.subject == subject && {int days = 0}) =>
e.type == GradeType.midYear && !gradeCalcMode
(days == 0 || ? gradeProvider
e.date .grades
.isBefore(DateTime.now().subtract(Duration(days: days))))) .where((e) =>
.toList(); e
.subject ==
subject &&
e.type == GradeType.midYear &&
(days ==
0 ||
e.date.isBefore(
DateTime.now().subtract(Duration(days: days)))))
.toList()
: calculatorProvider.grades
.where((e) => e.subject == subject)
.toList();
void generateTiles() { void generateTiles() {
List<GradeSubject> subjects = gradeProvider.grades List<GradeSubject> subjects = gradeProvider.grades
@ -200,6 +220,7 @@ class _GradesPageState extends State<GradesPage> {
user = Provider.of<UserProvider>(context); user = Provider.of<UserProvider>(context);
gradeProvider = Provider.of<GradeProvider>(context); gradeProvider = Provider.of<GradeProvider>(context);
updateProvider = Provider.of<UpdateProvider>(context); updateProvider = Provider.of<UpdateProvider>(context);
calculatorProvider = Provider.of<GradeCalculatorProvider>(context);
context.watch<PremiumProvider>(); context.watch<PremiumProvider>();
List<String> nameParts = user.displayName?.split(" ") ?? ["?"]; List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
@ -218,21 +239,31 @@ class _GradesPageState extends State<GradesPage> {
.date .date
: DateTime.now(); : DateTime.now();
final currentStudentAvg = AverageHelper.averageEvals(gradeProvider.grades final currentStudentAvg = AverageHelper.averageEvals(!gradeCalcMode
.where((e) => e.type == GradeType.midYear) ? gradeProvider.grades
.toList()); .where((e) => e.type == GradeType.midYear)
.toList()
: calculatorProvider.grades.toList());
final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
.where((e) => e.type == GradeType.midYear) .where((e) => e.type == GradeType.midYear)
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30)))) .where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
.toList()); .toList());
List<Grade> graphGrades = gradeProvider.grades List<Grade> graphGrades = !gradeCalcMode
.where((e) => ? gradeProvider.grades
e.type == GradeType.midYear && .where((e) =>
(avgDropValue == 0 || e.type == GradeType.midYear &&
(avgDropValue == 0 ||
e.date.isAfter(
DateTime.now().subtract(Duration(days: avgDropValue)))))
.toList()
: calculatorProvider.grades
.where(((e) =>
avgDropValue == 0 ||
e.date.isAfter( e.date.isAfter(
DateTime.now().subtract(Duration(days: avgDropValue))))) DateTime.now().subtract(Duration(days: avgDropValue)))))
.toList(); .toList();
yearlyGraph = Padding( yearlyGraph = Padding(
padding: const EdgeInsets.only(top: 12.0, bottom: 8.0), padding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
@ -278,6 +309,7 @@ class _GradesPageState extends State<GradesPage> {
generateTiles(); generateTiles();
return Scaffold( return Scaffold(
key: _scaffoldKey,
body: Padding( body: Padding(
padding: const EdgeInsets.only(top: 9.0), padding: const EdgeInsets.only(top: 9.0),
child: NestedScrollView( child: NestedScrollView(
@ -291,7 +323,23 @@ class _GradesPageState extends State<GradesPage> {
snap: false, snap: false,
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
actions: [ actions: [
// Profile Icon Padding(
padding: const EdgeInsets.symmetric(
horizontal: 5.0, vertical: 0.0),
child: IconButton(
splashRadius: 24.0,
onPressed: () {
// SoonAlert.show(context: context);
gradeCalcTotal(context);
},
icon: Icon(
FeatherIcons.plus,
color: AppColors.of(context).text,
),
),
),
// profile Icon
Padding( Padding(
padding: const EdgeInsets.only(right: 24.0), padding: const EdgeInsets.only(right: 24.0),
child: ProfileButton( child: ProfileButton(
@ -355,4 +403,30 @@ class _GradesPageState extends State<GradesPage> {
), ),
); );
} }
void gradeCalcTotal(BuildContext context) {
calculatorProvider.clear();
calculatorProvider.addAllGrades(gradeProvider.grades);
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
(context) => const RoundedBottomSheet(
child: GradeCalculator(null), borderRadius: 14.0),
backgroundColor: const Color(0x00000000),
elevation: 12.0,
);
// Hide the fab and grades
setState(() {
gradeCalcMode = true;
});
_sheetController!.closed.then((value) {
// Show fab and grades
if (mounted) {
setState(() {
gradeCalcMode = false;
});
}
});
}
} }