forked from firka/student-legacy
fancy bar chart thing on absences page
This commit is contained in:
parent
73db67c4e3
commit
1388ba58c1
@ -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,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user