almost finished new subjects page

This commit is contained in:
Kima 2023-12-30 23:47:09 +01:00
parent e62fd40f88
commit 6297b9cc24
4 changed files with 145 additions and 23 deletions

View File

@ -23,12 +23,12 @@ class AverageDisplay extends StatelessWidget {
return Container(
width: border ? 57.0 : 54.0,
padding: EdgeInsets.symmetric(
horizontal: 8.0 - (border ? 2 : 0), vertical: 6.0 - (border ? 2 : 0)),
horizontal: 6.0 - (border ? 2 : 0), vertical: 5.0 - (border ? 2 : 0)),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(45.0),
border: border
? Border.fromBorderSide(
BorderSide(color: color.withOpacity(.5), width: 3.0))
BorderSide(color: color.withOpacity(.5), width: 1.0))
: null,
color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null,
),
@ -36,7 +36,7 @@ class AverageDisplay extends StatelessWidget {
average == 0.0 ? "-" : averageText,
textAlign: TextAlign.center,
style: TextStyle(
color: color, fontWeight: FontWeight.w600, fontSize: 14.0),
color: color, fontWeight: FontWeight.w600, fontSize: 15.0),
maxLines: 1,
),
);

View File

@ -4,6 +4,7 @@ import 'package:filcnaplo/theme/colors/colors.dart';
import 'package:filcnaplo/utils/format.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:filcnaplo_mobile_ui/common/average_display.dart';
import 'package:filcnaplo_mobile_ui/common/round_border_icon.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -44,9 +45,18 @@ class GradeSubjectTile extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
visualDensity: VisualDensity.compact,
onTap: onTap,
leading: Icon(
SubjectIcon.resolveVariant(subject: subject, context: context),
color: textColor.withOpacity(.75)),
leading: RoundBorderIcon(
icon: Icon(
SubjectIcon.resolveVariant(
context: context,
subject: subject,
),
size: 22.0,
weight: 2.5,
),
padding: 5.0,
width: 1.0,
),
title: Text(
subject.renamedTo ?? subject.name.capital(),
maxLines: 2,

View File

@ -3,8 +3,11 @@
import 'dart:math';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:collection/collection.dart';
import 'package:filcnaplo/api/providers/update_provider.dart';
import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart';
import 'package:filcnaplo_kreta_api/models/exam.dart';
import 'package:filcnaplo_kreta_api/providers/exam_provider.dart';
// import 'package:filcnaplo_kreta_api/client/api.dart';
// import 'package:filcnaplo_kreta_api/client/client.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
@ -13,12 +16,14 @@ import 'package:filcnaplo/theme/colors/colors.dart';
import 'package:filcnaplo_kreta_api/models/grade.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:filcnaplo_kreta_api/models/group_average.dart';
import 'package:filcnaplo_kreta_api/providers/homework_provider.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/panel/panel.dart';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/exam/exam_viewable.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/statistics_tile.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/grade/grade_subject_tile.dart';
import 'package:filcnaplo_mobile_ui/common/trend_display.dart';
@ -53,6 +58,9 @@ class GradesPageState extends State<GradesPage> {
late GradeProvider gradeProvider;
late UpdateProvider updateProvider;
late GradeCalculatorProvider calculatorProvider;
late HomeworkProvider homeworkProvider;
late ExamProvider examProvider;
late String firstName;
late Widget yearlyGraph;
late Widget gradesCount;
@ -92,6 +100,8 @@ class GradesPageState extends State<GradesPage> {
Map<GradeSubject, double> subjectAvgs = {};
if (!gradeCalcMode) {
var i = 0;
tiles.addAll(subjects.map((subject) {
List<Grade> subjectGrades = getSubjectGrades(subject);
@ -112,15 +122,105 @@ class GradesPageState extends State<GradesPage> {
if (avg != 0) subjectAvgs[subject] = avg;
return GradeSubjectTile(
subject,
averageBefore: averageBefore,
average: avg,
groupAverage: avgDropValue == 0 ? groupAverage : 0.0,
onTap: () {
GradeSubjectView(subject, groupAverage: groupAverage)
.push(context, root: true);
},
i++;
int homeworkCount = homeworkProvider.homework
.where((e) => e.subject.id == subject.id)
.length;
bool hasHomework = homeworkCount > 0;
Exam? nearestExam = examProvider.exams
.firstWhereOrNull((e) => e.subject.id == subject.id);
bool hasUnder = hasHomework || nearestExam != null;
return Padding(
padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero,
child: Column(
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: const Radius.circular(16.0),
topRight: const Radius.circular(16.0),
bottomLeft: hasUnder
? const Radius.circular(8.0)
: const Radius.circular(16.0),
bottomRight: hasUnder
? const Radius.circular(8.0)
: const Radius.circular(16.0),
),
color: Theme.of(context).colorScheme.background,
),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 8.0, horizontal: 6.0),
child: GradeSubjectTile(
subject,
averageBefore: averageBefore,
average: avg,
groupAverage: avgDropValue == 0 ? groupAverage : 0.0,
onTap: () {
GradeSubjectView(subject, groupAverage: groupAverage)
.push(context, root: true);
},
),
),
),
if (hasUnder)
const SizedBox(
height: 6.0,
),
if (hasHomework)
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: const Radius.circular(8.0),
topRight: const Radius.circular(8.0),
bottomLeft: nearestExam != null
? const Radius.circular(8.0)
: const Radius.circular(16.0),
bottomRight: nearestExam != null
? const Radius.circular(8.0)
: const Radius.circular(16.0),
),
color: Theme.of(context).colorScheme.background,
),
child: Padding(
padding: const EdgeInsets.only(
top: 8.0,
bottom: 8.0,
left: 15.0,
right: 8.0,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('you_have_hw'.i18n.fill([homeworkCount])),
// const Icon(
// FeatherIcons.chevronRight,
// grade: 0.5,
// size: 20.0,
// )
],
),
),
),
if (nearestExam != null)
Container(
decoration: BoxDecoration(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(8.0),
topRight: Radius.circular(8.0),
bottomLeft: Radius.circular(16.0),
bottomRight: Radius.circular(16.0),
),
color: Theme.of(context).colorScheme.background,
),
child: ExamViewable(nearestExam),
),
],
),
);
}));
} else {
@ -165,8 +265,8 @@ class GradesPageState extends State<GradesPage> {
)),
);
tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0)));
tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
// tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0)));
// tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
}
tiles.add(Padding(
padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0),
@ -193,6 +293,9 @@ class GradesPageState extends State<GradesPage> {
: 0.0;
if (subjectAvg > 0 && !gradeCalcMode) {
tiles.add(
PanelTitle(title: Text("data".i18n)),
);
tiles.add(Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -248,6 +351,9 @@ class GradesPageState extends State<GradesPage> {
gradeProvider = Provider.of<GradeProvider>(context);
updateProvider = Provider.of<UpdateProvider>(context);
calculatorProvider = Provider.of<GradeCalculatorProvider>(context);
homeworkProvider = Provider.of<HomeworkProvider>(context);
examProvider = Provider.of<ExamProvider>(context);
context.watch<PremiumProvider>();
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];

View File

@ -4,9 +4,9 @@ extension Localization on String {
static final _t = Translations.byLocale("hu_hu") +
{
"en_en": {
"Grades": "Grades",
"Grades": "Subjects",
"Ghost Grades": "Grades",
"Subjects": "Subjects",
"Subjects": "Your Subjects",
"Subjects_changes": "Subject Differences",
"empty": "You don't have any subjects.",
"annual_average": "Annual average",
@ -18,11 +18,13 @@ extension Localization on String {
"classavg": "Class Average",
"fail_warning": "Failure warning",
"fail_warning_description": "You are failing %d subject(s)",
"data": "Data",
"you_have_hw": "You have %s homework(s) to do",
},
"hu_hu": {
"Grades": "Jegyek",
"Grades": "Tantárgyak",
"Ghost Grades": "Szellem jegyek",
"Subjects": "Tantárgyak",
"Subjects": "Tantárgyaid",
"Subjects_changes": "Tantárgyi változások",
"empty": "Még nincs egy tárgyad sem.",
"annual_average": "Éves átlag",
@ -34,11 +36,13 @@ extension Localization on String {
"classavg": "Osztályátlag",
"fail_warning": "Bukás figyelmeztető",
"fail_warning_description": "Bukásra állsz %d tantárgyból",
"data": "Adatok",
"you_have_hw": "%s házi feladat vár rád",
},
"de_de": {
"Grades": "Noten",
"Grades": "Fächer",
"Ghost Grades": "Geist Noten",
"Subjects": "Fächer",
"Subjects": "Ihre Themen",
"Subjects_changes": "Betreff Änderungen",
"empty": "Sie haben keine Fächer.",
"annual_average": "Jahresdurchschnitt",
@ -50,6 +54,8 @@ extension Localization on String {
"classavg": "Klassendurchschnitt",
"fail_warning": "Ausfallwarnung",
"fail_warning_description": "Sie werden in %d des Fachs durchfallen",
"data": "Daten",
"you_have_hw": "Du hast %s Hausaufgaben",
},
};