Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
db58b54754 | ||
|
|
7de3d211bb | ||
|
|
d3e5fc99ea | ||
|
|
17cffc0576 |
14
changelog.md
14
changelog.md
@@ -1,16 +1,6 @@
|
|||||||
What's new:
|
What's new:
|
||||||
|
|
||||||
- A jelenlegi hét kiválasztása esetén, egyből az aktuális napot választja ki ⏰
|
- Több szín lehetőség, egyedi hexadecimális szín választás
|
||||||
- A szellemjegyeknél bármilyen értéket megadhatsz 🎲
|
- Több tanuló esetén legutóbb kiválasztott tanuló mutatása indításkor
|
||||||
- A házifeladatok mostmár tökéletesen működnek 📚
|
|
||||||
- Mobilnetes firssítésnél figyelmeztetés ⚠️
|
|
||||||
- Hibajavítások 🐛
|
- Hibajavítások 🐛
|
||||||
- **Megérkezett a Filc Premium!** ✨
|
- **Megérkezett a Filc Premium!** ✨
|
||||||
|
|
||||||
Prémium funkciók:
|
|
||||||
|
|
||||||
- Egyedi név 👤
|
|
||||||
- Részletes jegy statisztikák 📈
|
|
||||||
- Testre szabhatóbb színek 🎨
|
|
||||||
- Választható tantárgy ikonok 📚
|
|
||||||
- Heti órarend nézet 📅
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:filcnaplo/models/settings.dart';
|
||||||
import 'package:filcnaplo/models/user.dart';
|
import 'package:filcnaplo/models/user.dart';
|
||||||
import 'package:filcnaplo_kreta_api/models/student.dart';
|
import 'package:filcnaplo_kreta_api/models/student.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
@@ -18,8 +19,13 @@ class UserProvider with ChangeNotifier {
|
|||||||
String? get nickname => user?.nickname;
|
String? get nickname => user?.nickname;
|
||||||
String? get displayName => user?.displayName;
|
String? get displayName => user?.displayName;
|
||||||
|
|
||||||
|
final SettingsProvider _settings;
|
||||||
|
|
||||||
|
UserProvider({required SettingsProvider settings}) : _settings = settings;
|
||||||
|
|
||||||
void setUser(String userId) {
|
void setUser(String userId) {
|
||||||
_selectedUserId = userId;
|
_selectedUserId = userId;
|
||||||
|
_settings.update(lastAccountId: userId);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,9 +52,7 @@ class App extends StatelessWidget {
|
|||||||
final UserProvider user;
|
final UserProvider user;
|
||||||
final DatabaseProvider database;
|
final DatabaseProvider database;
|
||||||
|
|
||||||
App({Key? key, required this.database, required this.settings, required this.user}) : super(key: key) {
|
const App({Key? key, required this.database, required this.settings, required this.user}) : super(key: key);
|
||||||
if (user.getUsers().isNotEmpty) user.setUser(user.getUsers().first.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const settingsDB = DatabaseStruct("settings", {
|
|||||||
"vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
|
"vibration_strength": int, "ab_weeks": int, "swap_ab_weeks": int,
|
||||||
"notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
|
"notifications": int, "notifications_bitfield": int, "notification_poll_interval": int, // notifications
|
||||||
"x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int,
|
"x_filc_id": String, "graph_class_avg": int, "presentation_mode": int, "bell_delay": int, "bell_delay_enabled": int,
|
||||||
"grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String,
|
"grade_opening_fun": int, "icon_pack": String, "premium_scopes": String, "premium_token": String, "last_account_id": String,
|
||||||
});
|
});
|
||||||
const usersDB = DatabaseStruct("users", {
|
const usersDB = DatabaseStruct("users", {
|
||||||
"id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int,
|
"id": String, "name": String, "username": String, "password": String, "institute_code": String, "student": String, "role": int,
|
||||||
|
|||||||
@@ -29,12 +29,18 @@ class DatabaseQuery {
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<UserProvider> getUsers() async {
|
Future<UserProvider> getUsers(SettingsProvider settings) async {
|
||||||
var userProvider = UserProvider();
|
var userProvider = UserProvider(settings: settings);
|
||||||
List<Map> usersMap = await db.query("users");
|
List<Map> usersMap = await db.query("users");
|
||||||
for (var user in usersMap) {
|
for (var user in usersMap) {
|
||||||
userProvider.addUser(User.fromMap(user));
|
userProvider.addUser(User.fromMap(user));
|
||||||
}
|
}
|
||||||
|
if (userProvider.getUsers().map((e) => e.id).contains(settings.lastAccountId)) {
|
||||||
|
userProvider.setUser(settings.lastAccountId);
|
||||||
|
} else {
|
||||||
|
userProvider.setUser(userProvider.getUsers().first.id);
|
||||||
|
settings.update(lastAccountId: userProvider.id);
|
||||||
|
}
|
||||||
return userProvider;
|
return userProvider;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,21 @@
|
|||||||
// ignore_for_file: no_leading_underscores_for_local_identifiers
|
|
||||||
|
|
||||||
import 'package:filcnaplo_kreta_api/models/grade.dart';
|
import 'package:filcnaplo_kreta_api/models/grade.dart';
|
||||||
|
|
||||||
class AverageHelper {
|
class AverageHelper {
|
||||||
static double averageEvals(List<Grade> grades, {bool finalAvg = false}) {
|
static double averageEvals(List<Grade> grades, {bool finalAvg = false}) {
|
||||||
List<String> ignoreInFinal = ["5,SzorgalomErtek", "4,MagatartasErtek"];
|
double average = 0.0;
|
||||||
if (finalAvg) grades.removeWhere((e) => (e.value.value == 0) || (ignoreInFinal.contains(e.gradeType?.id)));
|
|
||||||
|
List<String> ignoreInFinal = ["5,SzorgalomErtek", "4,MagatartasErtek"];
|
||||||
|
|
||||||
|
if (finalAvg) {
|
||||||
|
grades.removeWhere((e) => (e.value.value == 0) || (ignoreInFinal.contains(e.gradeType?.id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var e in grades) {
|
||||||
|
average += e.value.value * ((finalAvg ? 100 : e.value.weight) / 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
average = average / grades.map((e) => (finalAvg ? 100 : e.value.weight) / 100).fold(0.0, (a, b) => a + b);
|
||||||
|
|
||||||
double average =
|
|
||||||
grades.map((e) => e.value.value * e.value.weight / 100.0).fold(0.0, (double a, double b) => a + b) / weightSum(grades, finalAvg: finalAvg);
|
|
||||||
return average.isNaN ? 0.0 : average;
|
return average.isNaN ? 0.0 : average;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double weightSum(List<Grade> grades, {bool finalAvg = false}) =>
|
|
||||||
grades.map((e) => finalAvg ? 1 : e.value.weight / 100).fold(0, (a, b) => a + b);
|
|
||||||
|
|
||||||
static int howManyNeeded(int grade, List<Grade> base, double goal, {bool filcgrade = true, double avg = 0, double wsum = 0}) {
|
|
||||||
double _avg = filcgrade ? averageEvals(base) : avg;
|
|
||||||
double _wsum = filcgrade ? weightSum(base) : wsum;
|
|
||||||
if (_avg >= goal) return 0;
|
|
||||||
return (_wsum * (_avg - goal) / (goal - grade)).ceil();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class Startup {
|
|||||||
await db.close();
|
await db.close();
|
||||||
await database.init();
|
await database.init();
|
||||||
settings = await database.query.getSettings(database);
|
settings = await database.query.getSettings(database);
|
||||||
user = await database.query.getUsers();
|
user = await database.query.getUsers(settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
Color _customHighlightColor;
|
Color _customHighlightColor;
|
||||||
List<String> _premiumScopes;
|
List<String> _premiumScopes;
|
||||||
String _premiumAccessToken;
|
String _premiumAccessToken;
|
||||||
|
String _lastAccountId;
|
||||||
|
|
||||||
SettingsProvider({
|
SettingsProvider({
|
||||||
DatabaseProvider? database,
|
DatabaseProvider? database,
|
||||||
@@ -97,6 +98,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
required Color customHighlightColor,
|
required Color customHighlightColor,
|
||||||
required List<String> premiumScopes,
|
required List<String> premiumScopes,
|
||||||
required String premiumAccessToken,
|
required String premiumAccessToken,
|
||||||
|
required String lastAccountId,
|
||||||
}) : _database = database,
|
}) : _database = database,
|
||||||
_language = language,
|
_language = language,
|
||||||
_startPage = startPage,
|
_startPage = startPage,
|
||||||
@@ -127,7 +129,8 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
_customBackgroundColor = customBackgroundColor,
|
_customBackgroundColor = customBackgroundColor,
|
||||||
_customHighlightColor = customHighlightColor,
|
_customHighlightColor = customHighlightColor,
|
||||||
_premiumScopes = premiumScopes,
|
_premiumScopes = premiumScopes,
|
||||||
_premiumAccessToken = premiumAccessToken;
|
_premiumAccessToken = premiumAccessToken,
|
||||||
|
_lastAccountId = lastAccountId;
|
||||||
|
|
||||||
factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) {
|
factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) {
|
||||||
Map<String, Object?>? configMap;
|
Map<String, Object?>? configMap;
|
||||||
@@ -176,6 +179,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
customHighlightColor: Color(map["custom_highlight_color"]),
|
customHighlightColor: Color(map["custom_highlight_color"]),
|
||||||
premiumScopes: jsonDecode(map["premium_scopes"]).cast<String>(),
|
premiumScopes: jsonDecode(map["premium_scopes"]).cast<String>(),
|
||||||
premiumAccessToken: map["premium_token"],
|
premiumAccessToken: map["premium_token"],
|
||||||
|
lastAccountId: map["last_account_id"],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,6 +218,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
"custom_highlight_color": _customHighlightColor.value,
|
"custom_highlight_color": _customHighlightColor.value,
|
||||||
"premium_scopes": jsonEncode(_premiumScopes),
|
"premium_scopes": jsonEncode(_premiumScopes),
|
||||||
"premium_token": _premiumAccessToken,
|
"premium_token": _premiumAccessToken,
|
||||||
|
"last_account_id": _lastAccountId,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,6 +261,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
customHighlightColor: const Color(0xff222222),
|
customHighlightColor: const Color(0xff222222),
|
||||||
premiumScopes: [],
|
premiumScopes: [],
|
||||||
premiumAccessToken: "",
|
premiumAccessToken: "",
|
||||||
|
lastAccountId: "",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,6 +296,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
Color? get customHighlightColor => _customHighlightColor;
|
Color? get customHighlightColor => _customHighlightColor;
|
||||||
List<String> get premiumScopes => _premiumScopes;
|
List<String> get premiumScopes => _premiumScopes;
|
||||||
String get premiumAccessToken => _premiumAccessToken;
|
String get premiumAccessToken => _premiumAccessToken;
|
||||||
|
String get lastAccountId => _lastAccountId;
|
||||||
|
|
||||||
Future<void> update({
|
Future<void> update({
|
||||||
bool store = true,
|
bool store = true,
|
||||||
@@ -323,6 +330,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
Color? customHighlightColor,
|
Color? customHighlightColor,
|
||||||
List<String>? premiumScopes,
|
List<String>? premiumScopes,
|
||||||
String? premiumAccessToken,
|
String? premiumAccessToken,
|
||||||
|
String? lastAccountId,
|
||||||
}) async {
|
}) async {
|
||||||
if (language != null && language != _language) _language = language;
|
if (language != null && language != _language) _language = language;
|
||||||
if (startPage != null && startPage != _startPage) _startPage = startPage;
|
if (startPage != null && startPage != _startPage) _startPage = startPage;
|
||||||
@@ -356,6 +364,7 @@ class SettingsProvider extends ChangeNotifier {
|
|||||||
if (customHighlightColor != null && customHighlightColor != _customHighlightColor) _customHighlightColor = customHighlightColor;
|
if (customHighlightColor != null && customHighlightColor != _customHighlightColor) _customHighlightColor = customHighlightColor;
|
||||||
if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes;
|
if (premiumScopes != null && premiumScopes != _premiumScopes) _premiumScopes = premiumScopes;
|
||||||
if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken;
|
if (premiumAccessToken != null && premiumAccessToken != _premiumAccessToken) _premiumAccessToken = premiumAccessToken;
|
||||||
|
if (lastAccountId != null && lastAccountId != _lastAccountId) _lastAccountId = lastAccountId;
|
||||||
|
|
||||||
if (store) await _database?.store.storeSettings(this);
|
if (store) await _database?.store.storeSettings(this);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ extension StringFormatUtils on String {
|
|||||||
htmlString = htmlString.replaceAll(RegExp(r'<p ?>'), "");
|
htmlString = htmlString.replaceAll(RegExp(r'<p ?>'), "");
|
||||||
htmlString = htmlString.replaceAll(RegExp(r'</p ?>'), "\n");
|
htmlString = htmlString.replaceAll(RegExp(r'</p ?>'), "\n");
|
||||||
var document = parse(htmlString);
|
var document = parse(htmlString);
|
||||||
return document.body?.text.trim() ?? "";
|
return document.body?.text.trim() ?? htmlString;
|
||||||
}
|
}
|
||||||
|
|
||||||
String limit(int max) {
|
String limit(int max) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
|
|||||||
homepage: https://filcnaplo.hu
|
homepage: https://filcnaplo.hu
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
version: 3.4.0+171
|
version: 3.4.1+172
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.16.0-80.1.beta <3.0.0"
|
sdk: ">=2.16.0-80.1.beta <3.0.0"
|
||||||
|
|||||||
Submodule filcnaplo_mobile_ui updated: 2b4ed2a4d1...19d78b7caa
Submodule filcnaplo_premium updated: 40999bf998...3f23e52748
Reference in New Issue
Block a user