Skip to content
This repository has been archived by the owner on Jan 19, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2 from HarryDeKat/development
Browse files Browse the repository at this point in the history
Small bug fixes
  • Loading branch information
HarryDeKat authored May 29, 2023
2 parents 0960596 + c3a4fc5 commit 4073399
Show file tree
Hide file tree
Showing 29 changed files with 337 additions and 199 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Silvio is een manier om je cijfers uit het [leerlingvolgsysteem Magister](https:

![screenshots](https://github.com/HarryDeKat/Silvio/assets/96647011/b8a7b276-47f6-4a9d-a9ae-3b0d7920244f)

## Contributie!
## Contributie

Alle contributies **zijn erg welkom**, omdat ik dit project niet voor eeuwig zelf kan ondersteunen. Je kan een contributies maken door een pull-request te openen, maar probeer wel een **goede beschijving** van je veranderingen/toevoegingen te maken. Verder, mocht je een UI toevoeging maken, probeer dan waar mogelijk [material 3](https://m3.material.io/) aan te houden.

Expand Down
1 change: 0 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<queries>
<intent>
Expand Down
2 changes: 2 additions & 0 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.transistorsoft.fetch</string>
Expand Down
1 change: 1 addition & 0 deletions lib/apis/abstact_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ abstract class Api {
Future<void> refreshGrade(Person person, Grade grade) async {}
Future<void> refreshSchoolYear(Person person, SchoolYear schoolYear,
void Function(int completed, int total) progress) async {}
Future<void> refreshAll(Person person) async {}
Future<void> logout() async {}

Widget buildLogin(BuildContext context);
Expand Down
11 changes: 7 additions & 4 deletions lib/apis/account_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,11 @@ class AccountProvider extends ChangeNotifier {
SchoolYear get schoolYear =>
AccountManager().getActive().activeProfile!.activeSchoolYear;

List<Filter> get activeFilters =>
List<Filter> get _activeFilters =>
AccountManager().getActive().activeProfile!.activeFilters;
List<Filter> activeFilters({bool isGlobal = false}) => isGlobal
? _activeFilters
: _activeFilters.where((f) => !f.isGlobal).toList();

void changeAccount(int? newid) {
config.activeProfileId = newid ?? config.activeProfileId;
Expand All @@ -68,13 +71,13 @@ class AccountProvider extends ChangeNotifier {
notifyListeners();
}

void addToFilter(Filter filter) {
activeFilters.add(filter);
void addToFilter(Filter filter, {bool isGlobal = false}) {
_activeFilters.add(filter..isGlobal = isGlobal);
notifyListeners();
}

void removeFromFilterWhere(bool Function(Filter) test) {
activeFilters.removeWhere(test);
_activeFilters.removeWhere(test);
notifyListeners();
}
}
30 changes: 16 additions & 14 deletions lib/apis/local_file.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:io';

import 'package:cr_file_saver/file_saver.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:silvio/apis/abstact_api.dart';
Expand Down Expand Up @@ -59,6 +60,9 @@ class LocalFile implements Api {
);
}

@override
Future<void> refreshAll(Person person) async {}

@override
Future<void> refreshCalendarEvents(Person person) async {}

Expand Down Expand Up @@ -111,19 +115,24 @@ class LocalFile implements Api {

Future<void> backupHiveBox<T>(
{required String boxName, BuildContext? context}) async {
String? selectedDirectory = await FilePicker.platform.getDirectoryPath();
String? selectedDirectory =
Platform.isIOS ? await FilePicker.platform.getDirectoryPath() : '';

if (selectedDirectory != null &&
((Platform.isAndroid &&
!await Permission.manageExternalStorage.request().isGranted) ||
Platform.isIOS)) {
if (selectedDirectory != null) {
final box = Hive.box<T>(boxName);
final boxPath = box.path;
await box.close();

try {
File(boxPath!).copy(
"$selectedDirectory/Accounts-${DateTime.now().millisecondsSinceEpoch}.Silvio");
if (Platform.isAndroid) {
CRFileSaver.saveFileWithDialog(SaveFileDialogParams(
sourceFilePath: boxPath!,
destinationFileName:
"Accounts-${DateTime.now().millisecondsSinceEpoch}.Silvio"));
} else {
File(boxPath!).copy(
"$selectedDirectory/Accounts-${DateTime.now().millisecondsSinceEpoch}.Silvio");
}
} catch (e) {
if (context != null) {
WidgetsBinding.instance.addPostFrameCallback((_) =>
Expand All @@ -135,13 +144,6 @@ Future<void> backupHiveBox<T>(
}
} finally {
await Hive.openBox<T>(boxName);
if (context != null) {
WidgetsBinding.instance.addPostFrameCallback(
(_) => ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text("Succes"),
showCloseIcon: true,
)));
}
}
}
}
53 changes: 47 additions & 6 deletions lib/apis/magister.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,16 @@ class Magister implements Api {
return const Terms();
}

@override
Future<void> refreshAll(Person person) async {
await Future.wait([
Future.wait(person.schoolYears.map(
(SchoolYear sY) => api.refreshSchoolYear(person, sY, (i, t) {}))),
api.refreshCalendarEvents(person),
api.setSchoolYears(person)
]);
}

@override
Future<void> refreshCalendarEvents(Person person) async {
dynamic futures = await Future.wait([
Expand Down Expand Up @@ -144,18 +154,45 @@ class Magister implements Api {
@override
Future<void> refreshSchoolYear(Person person, SchoolYear schoolYear,
void Function(int completed, int total) progress) async {
//Get new grades from Magister
List<dynamic> cijferoverzichtvooraanmelding = (await api.dio.get(
"api/personen/${person.id}/aanmeldingen/${schoolYear.id}/cijfers/cijferoverzichtvooraanmelding?actievePerioden=false&alleenBerekendeKolommen=false&alleenPTAKolommen=false&peildatum=${schoolYear.end.toIso8601String()}"))
.data["Items"];

//Remove grades that do not exist on Magisters servers anymore
schoolYear.grades.removeWhere((Grade grade) =>
!cijferoverzichtvooraanmelding
.map((e) => e["CijferKolom"]["Id"])
.contains(grade.id));

//Remove useless grades
cijferoverzichtvooraanmelding.removeWhere((grade) =>
!grade.keys.contains("CijferKolom") ||
grade["CijferKolom"]["KolomSoort"] != 1 ||
schoolYear.grades
.map(
(e) => e.id,
)
.contains(grade["CijferKolom"]["Id"]));
grade["CijferKolom"]["KolomSoort"] != 1);

//Refresh grades that have been changed
List toRemove = [];
for (var rawGrade in cijferoverzichtvooraanmelding) {
Grade? connectedGrade = schoolYear.grades.firstWhereOrNull(
(grade) => grade.id == rawGrade["CijferKolom"]["Id"]);
//If the grade already exists and the dates from Magister and the local database do not match, refresh the grade.
if (DateTime.parse(rawGrade["DatumIngevoerd"] ??
rawGrade["ingevoerdOp"] ??
"1970-01-01T00:00:00.0000000Z")
.toUtc() !=
connectedGrade?.addedDate) {
if (connectedGrade != null) refreshGrade(person, connectedGrade);
}
//If grade already exists in local database make the grade for removal
if (connectedGrade != null &&
rawGrade["CijferKolom"]["Id"] == connectedGrade.id) {
toRemove.add(rawGrade);
}
}

//Remove grades that were marked for removal
cijferoverzichtvooraanmelding
.removeWhere((rawGrade) => toRemove.contains(rawGrade));

Future<void> addExtraData(Map<String, dynamic> grade) async {
Map<String, dynamic> extracijferkolominfo = (await api.dio.get(
Expand All @@ -176,6 +213,9 @@ class Magister implements Api {
progress,
);

//Get latest schoolQuaters
await api.setSchoolQuarters(person, schoolYear);

//Convert all Magister grades to Silvio grades
schoolYear.grades.addAll(cijferoverzichtvooraanmelding
.map((cijfer) => magisterGrade(
Expand All @@ -187,6 +227,7 @@ class Magister implements Api {
..sort((Grade a, Grade b) => a.addedDate.millisecondsSinceEpoch
.compareTo(b.addedDate.millisecondsSinceEpoch))
..reversed.toList());

if (account.isInBox) account.save();
}

Expand Down
36 changes: 20 additions & 16 deletions lib/apis/magister/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -162,25 +162,30 @@ class MagisterApi extends Magister {
List apiSchoolYears = (await dio
.get("api/leerlingen/${person.id}/aanmeldingen?begin=1970-01-01"))
.data["items"];

//Remove already existing schoolyears
List<SchoolYear> newFoundSchoolYears = apiSchoolYears
.map((e) => magisterSchoolYear(e)!)
.toList()
..removeWhere(
(sY) => person.rawSchoolYears.map((e) => e.id).contains(sY.id));

//Add the new found schoolyears
person.rawSchoolYears = List.from(person.rawSchoolYears)
..addAll(apiSchoolYears.map((e) => magisterSchoolYear(e)!).toList()
..removeWhere(
(sY) => person.schoolYears.map((e) => e.id).contains(sY.id)));
..addAll(newFoundSchoolYears);
if (account.isInBox) account.save();
}

Future<void> setSchoolSchoolQuarters(Person person) async {
for (SchoolYear schoolYear in person.schoolYears) {
List perioden =
(await dio.get("/api/aanmeldingen/${schoolYear.id}/cijfers/perioden"))
.data["items"];
schoolYear.schoolQuarters = List.from(schoolYear.schoolQuarters)
..addAll(perioden.map((sQua) => magisterSchoolQuarter(sQua)!).toList()
..removeWhere((sQua) =>
schoolYear.schoolQuarters.map((e) => e.id).contains(sQua.id)));
schoolYear.schoolQuarters
.sort((SchoolQuarter a, SchoolQuarter b) => a.id.compareTo(b.id));
}
Future<void> setSchoolQuarters(Person person, SchoolYear schoolYear) async {
List perioden =
(await dio.get("/api/aanmeldingen/${schoolYear.id}/cijfers/perioden"))
.data["items"];
schoolYear.schoolQuarters = List.from(schoolYear.schoolQuarters)
..addAll(perioden.map((sQua) => magisterSchoolQuarter(sQua)!).toList()
..removeWhere((sQua) =>
schoolYear.schoolQuarters.map((e) => e.id).contains(sQua.id)));
schoolYear.schoolQuarters
.sort((SchoolQuarter a, SchoolQuarter b) => a.id.compareTo(b.id));
if (account.isInBox) account.save();
}

Expand All @@ -199,7 +204,6 @@ class MagisterApi extends Magister {
await refreshProfilePicture(person);
await refreshCalendarEvents(person);
await setSchoolYears(person);
await setSchoolSchoolQuarters(person);

person.config.activeSchoolYearId = person.schoolYears.first.id;
account.profiles.add(person);
Expand Down
3 changes: 3 additions & 0 deletions lib/apis/random.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ class RandomAccount implements Api {
@override
late bool isOnline = false;

@override
Future<void> refreshAll(Person person) async {}

@override
Future refreshGrade(Person person, Grade grade) async {
grade = randomGrade(grade.subject);
Expand Down
3 changes: 3 additions & 0 deletions lib/apis/somtoday.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ class SomToDay implements Api {
return Terms(account);
}

@override
Future<void> refreshAll(Person person) async {}

@override
Future<void> refreshCalendarEvents(Person person) async {
// TODO: implement refreshCalendarEvents
Expand Down
22 changes: 11 additions & 11 deletions lib/hive/adapters.dart
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,11 @@ class Person {
.firstWhereOrNull((account) => account.profiles.contains(this));
void save() => parentAccount!.save();

Person({
required this.id,
required this.firstName,
this.lastName = "",
this.profilePicture
});
Person(
{required this.id,
required this.firstName,
this.lastName = "",
this.profilePicture});
}

@HiveType(typeId: 6)
Expand All @@ -155,11 +154,12 @@ class PersonConfig {
enum FilterTypes { quarterCode, subject, teacher, inputString, pta, dateRange }

class Filter {
late String name;
late FilterTypes type;
late dynamic filter;
String name;
FilterTypes type;
dynamic filter;
bool isGlobal;

Filter({required this.name, required this.type, required this.filter});
Filter({required this.name, required this.type, required this.filter, this.isGlobal = false});
}

@HiveType(typeId: 7)
Expand Down Expand Up @@ -411,4 +411,4 @@ enum GradeListBadges {
changeInAverage,
@HiveField(4)
changeInAverageSubject
}
}
9 changes: 6 additions & 3 deletions lib/hive/adapters.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 7 additions & 15 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,17 @@ class _Start extends State<Start> {

if (constraints.maxWidth < 450) {
return Scaffold(
appBar: const SilvioAppBar(),
appBar: SilvioAppBar(
title: screenIndex == 2
? AppLocalizations.of(context)?.searchView
: null,
),
body: BottomBanner(
child: RefreshIndicator(
onRefresh: () async {
AccountProvider acP =
Provider.of<AccountProvider>(context, listen: false);
Api api = acP.account.api;
await Future.wait([
Future.wait(acP.person.schoolYears.map((SchoolYear sY) =>
api.refreshSchoolYear(acP.person, sY, (i, t) {}))),
api.refreshCalendarEvents(acP.person)
]);
await acP.account.api.refreshAll(acP.person);
acP.changeAccount(null);
},
child: ScreensSwitch(index: screenIndex))),
Expand Down Expand Up @@ -235,14 +234,7 @@ class _Start extends State<Start> {
AccountProvider acP =
Provider.of<AccountProvider>(context,
listen: false);
Api api = acP.account.api;
await Future.wait([
Future.wait(acP.person.schoolYears.map(
(SchoolYear sY) =>
api.refreshSchoolYear(
acP.person, sY, (i, t) {}))),
api.refreshCalendarEvents(acP.person)
]);
await acP.account.api.refreshAll(acP.person);
acP.changeAccount(null);
},
child: ScreensSwitch(index: screenIndex))))),
Expand Down
Loading

0 comments on commit 4073399

Please sign in to comment.