finished grade importing and exporting totally

This commit is contained in:
Kima 2024-06-16 21:32:27 +02:00
parent dd8a4430a9
commit c0dd84c665
4 changed files with 139 additions and 32 deletions

View File

@ -1,6 +1,7 @@
// ignore_for_file: no_leading_underscores_for_local_identifiers
import 'package:refilc/utils/format.dart';
import 'package:uuid/uuid.dart';
import 'category.dart';
import 'subject.dart';
import 'teacher.dart';
@ -75,6 +76,40 @@ class Grade {
);
}
factory Grade.fromExportJson(Map json) {
return Grade(
id: const Uuid().v4(),
date: json["date"] != null ? DateTime.parse(json["date"]) : DateTime(0),
value: GradeValue(
json["value"] ?? 0,
json["value_name"] ?? "",
json["value_name"] ?? "",
json["weight"] ?? 0,
percentage: false,
),
teacher: Teacher.fromString((json["teacher"] ?? "").trim()),
description: json["description"] ?? "",
type: json["type"] != null
? Category.getGradeType(json["type"]
.replaceAll("midYear", "evkozi_jegy_ertekeles")
.replaceAll("halfYear", "felevi_jegy_ertekeles")
.replaceAll("endYear", "evvegi_jegy_ertekeles"))
: GradeType.unknown,
groupId: const Uuid().v4(),
subject: GradeSubject(
id: const Uuid().v4(),
category: Category.fromJson({}),
name: json["subject"] ?? ""),
mode: Category.fromJson({}),
writeDate:
json["date"] != null ? DateTime.parse(json["date"]) : DateTime(0),
seenDate:
json["date"] != null ? DateTime.parse(json["date"]) : DateTime(0),
form: "",
json: json,
);
}
bool compareTo(dynamic other) {
if (runtimeType != other.runtimeType) return false;

View File

@ -1,9 +1,12 @@
// ignore_for_file: no_leading_underscores_for_local_identifiers
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:collection/collection.dart';
import 'package:file_picker/file_picker.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:refilc/api/providers/update_provider.dart';
import 'package:refilc/models/settings.dart';
@ -89,19 +92,18 @@ class GradesPageState extends State<GradesPage> {
int avgDropValue = 0;
bool gradeCalcMode = false;
bool importedViewMode = false;
List<Grade> jsonGrades = [];
List<Grade> getSubjectGrades(GradeSubject subject,
{int days = 0}) =>
!gradeCalcMode
? gradeProvider
.grades
? (importedViewMode ? jsonGrades : gradeProvider.grades)
.where((e) =>
e
.subject ==
subject &&
e.subject == subject &&
e.type == GradeType.midYear &&
(days ==
0 ||
(days == 0 ||
e.date.isBefore(
DateTime.now().subtract(Duration(days: days)))))
.toList()
@ -110,18 +112,19 @@ class GradesPageState extends State<GradesPage> {
.toList();
void generateTiles() {
List<GradeSubject> subjects = gradeProvider.grades
.map((e) => GradeSubject(
category: e.subject.category,
id: e.subject.id,
name: e.subject.name,
renamedTo: e.subject.renamedTo,
customRounding: e.subject.customRounding,
teacher: e.teacher,
))
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
List<GradeSubject> subjects =
(importedViewMode ? jsonGrades : gradeProvider.grades)
.map((e) => GradeSubject(
category: e.subject.category,
id: e.subject.id,
name: e.subject.name,
renamedTo: e.subject.renamedTo,
customRounding: e.subject.customRounding,
teacher: e.teacher,
))
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
List<Widget> tiles = [];
Map<GradeSubject, double> subjectAvgs = {};
@ -165,7 +168,8 @@ class GradesPageState extends State<GradesPage> {
e.subject.id == subject.id && e.writeDate.isAfter(DateTime.now()));
bool hasUnder = (hasHomework || nearestExam != null) &&
Provider.of<SettingsProvider>(context).qSubjectsSubTiles;
Provider.of<SettingsProvider>(context, listen: false)
.qSubjectsSubTiles;
return Padding(
padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero,
@ -220,7 +224,8 @@ class GradesPageState extends State<GradesPage> {
height: 6.0,
),
if (hasHomework &&
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
Provider.of<SettingsProvider>(context, listen: false)
.qSubjectsSubTiles)
Container(
decoration: BoxDecoration(
boxShadow: [
@ -448,25 +453,28 @@ class GradesPageState extends State<GradesPage> {
.fold(0.0, (double a, double b) => a + b) /
gradeProvider.groupAverages.length;
final now = gradeProvider.grades.isNotEmpty
? gradeProvider.grades
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
.date
: DateTime.now();
final now =
(importedViewMode ? jsonGrades : gradeProvider.grades).isNotEmpty
? (importedViewMode ? jsonGrades : gradeProvider.grades)
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
.date
: DateTime.now();
final currentStudentAvg = AverageHelper.averageEvals(!gradeCalcMode
? gradeProvider.grades
? (importedViewMode ? jsonGrades : gradeProvider.grades)
.where((e) => e.type == GradeType.midYear)
.toList()
: calculatorProvider.grades);
final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades
final prevStudentAvg = AverageHelper.averageEvals((importedViewMode
? jsonGrades
: gradeProvider.grades)
.where((e) => e.type == GradeType.midYear)
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
.toList());
List<Grade> graphGrades = !gradeCalcMode
? gradeProvider.grades
? (importedViewMode ? jsonGrades : gradeProvider.grades)
.where((e) =>
e.type == GradeType.midYear &&
(avgDropValue == 0 ||
@ -500,7 +508,7 @@ class GradesPageState extends State<GradesPage> {
// const SizedBox(width: 4.0),
TrendDisplay(
previous: prevStudentAvg, current: currentStudentAvg),
if (gradeProvider.grades
if ((importedViewMode ? jsonGrades : gradeProvider.grades)
.where((e) => e.type == GradeType.midYear)
.isNotEmpty)
AverageDisplay(average: currentStudentAvg),
@ -632,7 +640,8 @@ class GradesPageState extends State<GradesPage> {
void gradeCalcTotal(BuildContext context) {
calculatorProvider.clear();
calculatorProvider.addAllGrades(gradeProvider.grades);
calculatorProvider
.addAllGrades((importedViewMode ? jsonGrades : gradeProvider.grades));
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
(context) => const RoundedBottomSheet(
@ -693,6 +702,68 @@ class GradesPageState extends State<GradesPage> {
const SizedBox(
height: 10.0,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: Theme.of(context).colorScheme.background),
child: ListTile(
title: Row(
children: [
const Icon(Icons.toll_rounded),
const SizedBox(
width: 10.0,
),
Text('import_grades'.i18n),
],
),
trailing: importedViewMode ? const Icon(FeatherIcons.x) : null,
onTap: () {
if (importedViewMode) {
importedViewMode = false;
generateTiles();
setState(() {});
Navigator.of(context, rootNavigator: true).pop();
return;
}
// if (!Provider.of<PlusProvider>(context, listen: false)
// .hasScope(PremiumScopes.gradeExporting)) {
// PlusLockedFeaturePopup.show(
// context: context, feature: PremiumFeature.gradeExporting);
// return;
// }
// show file picker
FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['json'],
).then((value) {
if (value != null) {
final File file = File(value.files.single.path!);
final String content = file.readAsStringSync();
final List<dynamic> json = jsonDecode(content);
jsonGrades = json.map((e) => Grade.fromJson(e)).toList();
importedViewMode = true;
generateTiles();
setState(() {});
print(content);
print(json);
print(jsonGrades.map((e) => e.json));
}
});
Navigator.of(context, rootNavigator: true).pop();
},
),
),
const SizedBox(
height: 10.0,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),

View File

@ -72,6 +72,7 @@ dependencies:
carousel_slider: ^4.2.1
flutter_portal: ^1.1.4
webview_flutter: ^4.8.0
file_picker: ^6.2.1
dev_dependencies:
flutter_lints: ^3.0.1

@ -1 +1 @@
Subproject commit 9bd46b81f230cd094787e1436cd5e8cdee7b5529
Subproject commit ac93b31cbc8a3ce2a9e9e2036e2f2ae4ffbe51f3