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

View File

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

View File

@ -3,8 +3,11 @@
import 'dart:math'; import 'dart:math';
import 'package:auto_size_text/auto_size_text.dart'; 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/api/providers/update_provider.dart';
import 'package:filcnaplo/ui/widgets/grade/grade_tile.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/api.dart';
// import 'package:filcnaplo_kreta_api/client/client.dart'; // import 'package:filcnaplo_kreta_api/client/client.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.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/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_kreta_api/providers/homework_provider.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/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';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.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/statistics_tile.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/grade/grade_subject_tile.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/grade/grade_subject_tile.dart';
import 'package:filcnaplo_mobile_ui/common/trend_display.dart'; import 'package:filcnaplo_mobile_ui/common/trend_display.dart';
@ -53,6 +58,9 @@ class GradesPageState extends State<GradesPage> {
late GradeProvider gradeProvider; late GradeProvider gradeProvider;
late UpdateProvider updateProvider; late UpdateProvider updateProvider;
late GradeCalculatorProvider calculatorProvider; late GradeCalculatorProvider calculatorProvider;
late HomeworkProvider homeworkProvider;
late ExamProvider examProvider;
late String firstName; late String firstName;
late Widget yearlyGraph; late Widget yearlyGraph;
late Widget gradesCount; late Widget gradesCount;
@ -92,6 +100,8 @@ class GradesPageState extends State<GradesPage> {
Map<GradeSubject, double> subjectAvgs = {}; Map<GradeSubject, double> subjectAvgs = {};
if (!gradeCalcMode) { if (!gradeCalcMode) {
var i = 0;
tiles.addAll(subjects.map((subject) { tiles.addAll(subjects.map((subject) {
List<Grade> subjectGrades = getSubjectGrades(subject); List<Grade> subjectGrades = getSubjectGrades(subject);
@ -112,7 +122,40 @@ class GradesPageState extends State<GradesPage> {
if (avg != 0) subjectAvgs[subject] = avg; if (avg != 0) subjectAvgs[subject] = avg;
return GradeSubjectTile( 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, subject,
averageBefore: averageBefore, averageBefore: averageBefore,
average: avg, average: avg,
@ -121,6 +164,63 @@ class GradesPageState extends State<GradesPage> {
GradeSubjectView(subject, groupAverage: groupAverage) GradeSubjectView(subject, groupAverage: groupAverage)
.push(context, root: true); .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 { } else {
@ -165,8 +265,8 @@ class GradesPageState extends State<GradesPage> {
)), )),
); );
tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 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(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0)));
} }
tiles.add(Padding( tiles.add(Padding(
padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0), padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0),
@ -193,6 +293,9 @@ class GradesPageState extends State<GradesPage> {
: 0.0; : 0.0;
if (subjectAvg > 0 && !gradeCalcMode) { if (subjectAvg > 0 && !gradeCalcMode) {
tiles.add(
PanelTitle(title: Text("data".i18n)),
);
tiles.add(Row( tiles.add(Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -248,6 +351,9 @@ class GradesPageState extends State<GradesPage> {
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); calculatorProvider = Provider.of<GradeCalculatorProvider>(context);
homeworkProvider = Provider.of<HomeworkProvider>(context);
examProvider = Provider.of<ExamProvider>(context);
context.watch<PremiumProvider>(); context.watch<PremiumProvider>();
List<String> nameParts = user.displayName?.split(" ") ?? ["?"]; List<String> nameParts = user.displayName?.split(" ") ?? ["?"];

View File

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