fancy bar chart thing on absences page

This commit is contained in:
Kima 2024-04-23 18:48:45 +02:00
parent 73db67c4e3
commit 1388ba58c1
3 changed files with 139 additions and 33 deletions

View File

@ -1,3 +1,5 @@
import "package:flutter/material.dart";
import "category.dart"; import "category.dart";
import "subject.dart"; import "subject.dart";
import "teacher.dart"; import "teacher.dart";
@ -96,3 +98,15 @@ class Absence {
} }
enum Justification { excused, unexcused, pending } enum Justification { excused, unexcused, pending }
class AbsenceChartData {
double start;
double end;
Color color;
AbsenceChartData({
required this.start,
required this.end,
this.color = Colors.transparent,
});
}

View File

@ -3,7 +3,7 @@
import 'dart:math'; import 'dart:math';
import 'package:animations/animations.dart'; import 'package:animations/animations.dart';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:collection/collection.dart';
import 'package:refilc/api/providers/update_provider.dart'; import 'package:refilc/api/providers/update_provider.dart';
import 'package:refilc/theme/colors/utils.dart'; import 'package:refilc/theme/colors/utils.dart';
import 'package:refilc/ui/date_widget.dart'; import 'package:refilc/ui/date_widget.dart';
@ -25,7 +25,6 @@ import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart'; import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
import 'package:refilc_mobile_ui/common/widgets/absence/absence_subject_tile.dart'; import 'package:refilc_mobile_ui/common/widgets/absence/absence_subject_tile.dart';
import 'package:refilc_mobile_ui/common/widgets/absence/absence_viewable.dart'; import 'package:refilc_mobile_ui/common/widgets/absence/absence_viewable.dart';
import 'package:refilc_mobile_ui/common/widgets/statistics_tile.dart';
import 'package:refilc_mobile_ui/common/widgets/miss_tile.dart'; import 'package:refilc_mobile_ui/common/widgets/miss_tile.dart';
import 'package:refilc_mobile_ui/pages/absences/absence_subject_view.dart'; import 'package:refilc_mobile_ui/pages/absences/absence_subject_view.dart';
import 'package:refilc/ui/filter/sort.dart'; import 'package:refilc/ui/filter/sort.dart';
@ -355,15 +354,24 @@ class AbsencesPageState extends State<AbsencesPage>
String title2 = ""; String title2 = "";
String suffix = ""; String suffix = "";
List<Absence> unexcused = [];
List<Absence> excused = [];
List<double> absencePositions = [];
List<Color> finalChartColors = [];
if (activeData == AbsenceFilter.absences.index) { if (activeData == AbsenceFilter.absences.index) {
value1 = absenceProvider.absences unexcused = absenceProvider.absences
.where((e) =>
e.delay == 0 && e.state == Justification.excused)
.length;
value2 = absenceProvider.absences
.where((e) => .where((e) =>
e.delay == 0 && e.state == Justification.unexcused) e.delay == 0 && e.state == Justification.unexcused)
.length; .toList();
excused = absenceProvider.absences
.where((e) =>
e.delay == 0 && e.state == Justification.excused)
.toList();
value1 = excused.length;
value2 = unexcused.length;
value3 = absenceProvider.absences value3 = absenceProvider.absences
.where((e) => .where((e) =>
e.delay == 0 && e.state == Justification.pending) e.delay == 0 && e.state == Justification.pending)
@ -372,16 +380,18 @@ class AbsencesPageState extends State<AbsencesPage>
title2 = "stat_2".i18n; title2 = "stat_2".i18n;
suffix = " ${"hr".i18n}"; suffix = " ${"hr".i18n}";
} else if (activeData == AbsenceFilter.delays.index) { } else if (activeData == AbsenceFilter.delays.index) {
value1 = absenceProvider.absences unexcused = absenceProvider.absences
.where((e) =>
e.delay != 0 && e.state == Justification.excused)
.map((e) => e.delay)
.fold(0, (a, b) => a + b);
value2 = absenceProvider.absences
.where((e) => .where((e) =>
e.delay != 0 && e.state == Justification.unexcused) e.delay != 0 && e.state == Justification.unexcused)
.map((e) => e.delay) .toList();
.fold(0, (a, b) => a + b); excused = absenceProvider.absences
.where((e) =>
e.delay != 0 && e.state == Justification.excused)
.toList();
value1 = excused.map((e) => e.delay).fold(0, (a, b) => a + b);
value2 =
unexcused.map((e) => e.delay).fold(0, (a, b) => a + b);
value3 = absenceProvider.absences value3 = absenceProvider.absences
.where((e) => .where((e) =>
e.delay != 0 && e.state == Justification.pending) e.delay != 0 && e.state == Justification.pending)
@ -392,6 +402,70 @@ class AbsencesPageState extends State<AbsencesPage>
suffix = " ${"min".i18n}"; suffix = " ${"min".i18n}";
} }
// bar chart magic
List<AbsenceChartData> absenceChartData = [];
int yr = DateTime.now().month < 9
? DateTime.now().year - 1
: DateTime.now().year;
int barTotal =
DateTime.now().difference(DateTime(yr, 09, 01)).inDays;
[...unexcused, ...excused].forEachIndexed((i, a) {
int abs = DateTime.now().difference(a.date).inDays;
double startPos = (barTotal - abs) / barTotal;
double endPos = startPos + (barTotal / 100 / barTotal);
if (absenceChartData.isEmpty) {
absenceChartData.add(AbsenceChartData(
start: 0.0,
end: startPos,
color: Theme.of(context).scaffoldBackgroundColor,
));
}
absenceChartData.add(AbsenceChartData(
start: startPos,
end: endPos,
color: a.state == Justification.excused
? Colors.green
: Colors.red,
));
if ([...unexcused, ...excused].length > i + 1) {
int nextAbs = DateTime.now()
.difference([...unexcused, ...excused][i + 1].date)
.inDays;
double nextStartPos = (barTotal - nextAbs) / barTotal;
// double nextEndPos = startPos + (barTotal / 100 / barTotal);
absenceChartData.add(AbsenceChartData(
start: endPos,
end: nextStartPos < 0.999 ? nextStartPos : 1.0,
color: Theme.of(context).scaffoldBackgroundColor,
));
}
// print(value2.toString() + '-total');
// print(absenceChartData.length.toString() + '-chartdata');
if ((i + 1 == [...unexcused, ...excused].length) &&
endPos < 0.999) {
absenceChartData.add(AbsenceChartData(
start: endPos,
end: 1.0,
color: Theme.of(context).scaffoldBackgroundColor,
));
}
});
for (var aP in absenceChartData) {
absencePositions.addAll([aP.start, aP.end]);
}
for (var aC in absenceChartData) {
finalChartColors.addAll([aC.color, aC.color]);
}
return Padding( return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
bottom: 20.0, left: 24.0, right: 24.0), bottom: 20.0, left: 24.0, right: 24.0),
@ -466,22 +540,40 @@ class AbsencesPageState extends State<AbsencesPage>
) )
], ],
), ),
// Column( const SizedBox(
// children: [ height: 18.0,
// // ide kell valami csik widget diagram idk ),
// // es ala ez Column(
// Row( children: [
// mainAxisAlignment: // ide kell valami csik widget diagram idk
// MainAxisAlignment.spaceBetween, Container(
// children: [ height: 9.11,
// Text( decoration: BoxDecoration(
// "sept".i18n, borderRadius: BorderRadius.circular(20.0),
// ), color: Theme.of(context)
// Text("now".i18n), .scaffoldBackgroundColor,
// ], gradient: LinearGradient(
// ), colors: finalChartColors,
// ], stops: absencePositions,
// ), begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
// es ala ez
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
"sept".i18n,
),
Text("now".i18n),
],
),
],
),
], ],
), ),
Row( Row(

@ -1 +1 @@
Subproject commit 88d375faebd0e6c1e844bd258248ee1386524656 Subproject commit 0375544fd81dba418568b50951a1f2022bf729eb