forked from firka/student-legacy
finished grade importing and exporting totally
This commit is contained in:
parent
dd8a4430a9
commit
c0dd84c665
@ -1,6 +1,7 @@
|
|||||||
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
||||||
|
|
||||||
import 'package:refilc/utils/format.dart';
|
import 'package:refilc/utils/format.dart';
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
import 'category.dart';
|
import 'category.dart';
|
||||||
import 'subject.dart';
|
import 'subject.dart';
|
||||||
import 'teacher.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) {
|
bool compareTo(dynamic other) {
|
||||||
if (runtimeType != other.runtimeType) return false;
|
if (runtimeType != other.runtimeType) return false;
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
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:collection/collection.dart';
|
||||||
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
import 'package:refilc/api/providers/update_provider.dart';
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
@ -89,19 +92,18 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
int avgDropValue = 0;
|
int avgDropValue = 0;
|
||||||
|
|
||||||
bool gradeCalcMode = false;
|
bool gradeCalcMode = false;
|
||||||
|
bool importedViewMode = false;
|
||||||
|
|
||||||
|
List<Grade> jsonGrades = [];
|
||||||
|
|
||||||
List<Grade> getSubjectGrades(GradeSubject subject,
|
List<Grade> getSubjectGrades(GradeSubject subject,
|
||||||
{int days = 0}) =>
|
{int days = 0}) =>
|
||||||
!gradeCalcMode
|
!gradeCalcMode
|
||||||
? gradeProvider
|
? (importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.grades
|
|
||||||
.where((e) =>
|
.where((e) =>
|
||||||
e
|
e.subject == subject &&
|
||||||
.subject ==
|
|
||||||
subject &&
|
|
||||||
e.type == GradeType.midYear &&
|
e.type == GradeType.midYear &&
|
||||||
(days ==
|
(days == 0 ||
|
||||||
0 ||
|
|
||||||
e.date.isBefore(
|
e.date.isBefore(
|
||||||
DateTime.now().subtract(Duration(days: days)))))
|
DateTime.now().subtract(Duration(days: days)))))
|
||||||
.toList()
|
.toList()
|
||||||
@ -110,7 +112,8 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
void generateTiles() {
|
void generateTiles() {
|
||||||
List<GradeSubject> subjects = gradeProvider.grades
|
List<GradeSubject> subjects =
|
||||||
|
(importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.map((e) => GradeSubject(
|
.map((e) => GradeSubject(
|
||||||
category: e.subject.category,
|
category: e.subject.category,
|
||||||
id: e.subject.id,
|
id: e.subject.id,
|
||||||
@ -165,7 +168,8 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
e.subject.id == subject.id && e.writeDate.isAfter(DateTime.now()));
|
e.subject.id == subject.id && e.writeDate.isAfter(DateTime.now()));
|
||||||
|
|
||||||
bool hasUnder = (hasHomework || nearestExam != null) &&
|
bool hasUnder = (hasHomework || nearestExam != null) &&
|
||||||
Provider.of<SettingsProvider>(context).qSubjectsSubTiles;
|
Provider.of<SettingsProvider>(context, listen: false)
|
||||||
|
.qSubjectsSubTiles;
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero,
|
padding: i > 1 ? const EdgeInsets.only(top: 9.0) : EdgeInsets.zero,
|
||||||
@ -220,7 +224,8 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
height: 6.0,
|
height: 6.0,
|
||||||
),
|
),
|
||||||
if (hasHomework &&
|
if (hasHomework &&
|
||||||
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
|
Provider.of<SettingsProvider>(context, listen: false)
|
||||||
|
.qSubjectsSubTiles)
|
||||||
Container(
|
Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
boxShadow: [
|
boxShadow: [
|
||||||
@ -448,25 +453,28 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
.fold(0.0, (double a, double b) => a + b) /
|
.fold(0.0, (double a, double b) => a + b) /
|
||||||
gradeProvider.groupAverages.length;
|
gradeProvider.groupAverages.length;
|
||||||
|
|
||||||
final now = gradeProvider.grades.isNotEmpty
|
final now =
|
||||||
? gradeProvider.grades
|
(importedViewMode ? jsonGrades : gradeProvider.grades).isNotEmpty
|
||||||
|
? (importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
|
.reduce((v, e) => e.date.isAfter(v.date) ? e : v)
|
||||||
.date
|
.date
|
||||||
: DateTime.now();
|
: DateTime.now();
|
||||||
|
|
||||||
final currentStudentAvg = AverageHelper.averageEvals(!gradeCalcMode
|
final currentStudentAvg = AverageHelper.averageEvals(!gradeCalcMode
|
||||||
? gradeProvider.grades
|
? (importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.where((e) => e.type == GradeType.midYear)
|
.where((e) => e.type == GradeType.midYear)
|
||||||
.toList()
|
.toList()
|
||||||
: calculatorProvider.grades);
|
: 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.type == GradeType.midYear)
|
||||||
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
|
.where((e) => e.date.isBefore(now.subtract(const Duration(days: 30))))
|
||||||
.toList());
|
.toList());
|
||||||
|
|
||||||
List<Grade> graphGrades = !gradeCalcMode
|
List<Grade> graphGrades = !gradeCalcMode
|
||||||
? gradeProvider.grades
|
? (importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.where((e) =>
|
.where((e) =>
|
||||||
e.type == GradeType.midYear &&
|
e.type == GradeType.midYear &&
|
||||||
(avgDropValue == 0 ||
|
(avgDropValue == 0 ||
|
||||||
@ -500,7 +508,7 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
// const SizedBox(width: 4.0),
|
// const SizedBox(width: 4.0),
|
||||||
TrendDisplay(
|
TrendDisplay(
|
||||||
previous: prevStudentAvg, current: currentStudentAvg),
|
previous: prevStudentAvg, current: currentStudentAvg),
|
||||||
if (gradeProvider.grades
|
if ((importedViewMode ? jsonGrades : gradeProvider.grades)
|
||||||
.where((e) => e.type == GradeType.midYear)
|
.where((e) => e.type == GradeType.midYear)
|
||||||
.isNotEmpty)
|
.isNotEmpty)
|
||||||
AverageDisplay(average: currentStudentAvg),
|
AverageDisplay(average: currentStudentAvg),
|
||||||
@ -632,7 +640,8 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
|
|
||||||
void gradeCalcTotal(BuildContext context) {
|
void gradeCalcTotal(BuildContext context) {
|
||||||
calculatorProvider.clear();
|
calculatorProvider.clear();
|
||||||
calculatorProvider.addAllGrades(gradeProvider.grades);
|
calculatorProvider
|
||||||
|
.addAllGrades((importedViewMode ? jsonGrades : gradeProvider.grades));
|
||||||
|
|
||||||
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
_sheetController = _scaffoldKey.currentState?.showBottomSheet(
|
||||||
(context) => const RoundedBottomSheet(
|
(context) => const RoundedBottomSheet(
|
||||||
@ -693,6 +702,68 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 10.0,
|
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(
|
Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(12.0),
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
|
@ -72,6 +72,7 @@ dependencies:
|
|||||||
carousel_slider: ^4.2.1
|
carousel_slider: ^4.2.1
|
||||||
flutter_portal: ^1.1.4
|
flutter_portal: ^1.1.4
|
||||||
webview_flutter: ^4.8.0
|
webview_flutter: ^4.8.0
|
||||||
|
file_picker: ^6.2.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_lints: ^3.0.1
|
flutter_lints: ^3.0.1
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 9bd46b81f230cd094787e1436cd5e8cdee7b5529
|
Subproject commit ac93b31cbc8a3ce2a9e9e2036e2f2ae4ffbe51f3
|
Loading…
x
Reference in New Issue
Block a user