diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index ad74def..5da2980 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -47,7 +47,7 @@
-
+
@@ -131,14 +131,14 @@
-
+
-
+
@@ -152,7 +152,7 @@
-
+
@@ -208,7 +208,7 @@
-
+
@@ -229,7 +229,7 @@
-
+
@@ -257,7 +257,7 @@
-
+
@@ -299,7 +299,7 @@
-
+
@@ -327,7 +327,35 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -411,7 +439,7 @@
-
+
@@ -460,14 +488,14 @@
-
+
-
+
@@ -502,14 +530,14 @@
-
+
-
+
@@ -527,10 +555,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
@@ -586,7 +635,7 @@
-
+
@@ -607,7 +656,7 @@
-
+
@@ -649,7 +698,7 @@
-
+
@@ -705,7 +754,7 @@
-
+
@@ -719,7 +768,7 @@
-
+
@@ -831,7 +880,7 @@
-
+
@@ -971,63 +1020,63 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1055,7 +1104,7 @@
-
+
@@ -1076,7 +1125,7 @@
-
+
@@ -1090,7 +1139,7 @@
-
+
@@ -1125,7 +1174,7 @@
-
+
@@ -1210,15 +1259,15 @@
-
-
+
+
-
+
@@ -1230,10 +1279,10 @@
-
-
+
+
-
+
@@ -1241,14 +1290,14 @@
-
+
-
+
-
+
@@ -1257,7 +1306,11 @@
-
+
+
+
+
+
@@ -1266,22 +1319,25 @@
-
+
-
-
+
+
-
-
+
+
-
+
+
+
+
@@ -1289,10 +1345,10 @@
-
+
-
+
@@ -1305,9 +1361,9 @@
-
+
-
+
@@ -1323,7 +1379,7 @@
-
+
@@ -1342,29 +1398,29 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
index e0b5f46..87dd116 100644
--- a/.idea/libraries/Flutter_Plugins.xml
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -20,17 +20,23 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/view/pages/more/countdown/animatedTime.dart b/lib/view/pages/more/countdown/animatedTime.dart
index 045f0d6..6c4e45c 100644
--- a/lib/view/pages/more/countdown/animatedTime.dart
+++ b/lib/view/pages/more/countdown/animatedTime.dart
@@ -13,11 +13,13 @@ class AnimatedTime extends StatefulWidget {
class _AnimatedTimeState extends State {
Duration current = Duration.zero;
+ late Timer timer;
@override
void initState() {
super.initState();
- Timer.periodic(const Duration(seconds: 1), (Timer t) => update());
+ timer = Timer.periodic(const Duration(seconds: 1), (Timer t) => update());
+ current = widget.callback();
}
void update() {
@@ -50,4 +52,10 @@ class _AnimatedTimeState extends State {
textStyle: const TextStyle(fontSize: 15),
);
}
+
+ @override
+ void dispose() {
+ timer.cancel();
+ super.dispose();
+ }
}
diff --git a/lib/view/pages/holidays/holidays.dart b/lib/view/pages/more/holidays/holidays.dart
similarity index 71%
rename from lib/view/pages/holidays/holidays.dart
rename to lib/view/pages/more/holidays/holidays.dart
index 602e270..98af4c9 100644
--- a/lib/view/pages/holidays/holidays.dart
+++ b/lib/view/pages/more/holidays/holidays.dart
@@ -1,12 +1,17 @@
import 'package:flutter/material.dart';
+import 'package:flutter_native_splash/cli_commands.dart';
import 'package:jiffy/jiffy.dart';
+import 'package:marianum_mobile/widget/centeredLeading.dart';
+import 'package:marianum_mobile/widget/debug/debugTile.dart';
+import 'package:marianum_mobile/widget/placeholderView.dart';
import 'package:provider/provider.dart';
-import '../../../api/holidays/getHolidaysResponse.dart';
-import '../../../model/holidays/holidaysProps.dart';
-import '../../../storage/base/settingsProvider.dart';
-import '../../../widget/confirmDialog.dart';
-import '../../../widget/loadingSpinner.dart';
+import '../../../../api/holidays/getHolidaysResponse.dart';
+import '../../../../model/holidays/holidaysProps.dart';
+import '../../../../storage/base/settingsProvider.dart';
+import '../../../../widget/confirmDialog.dart';
+import '../../../../widget/loadingSpinner.dart';
+import '../countdown/animatedTime.dart';
class Holidays extends StatefulWidget {
const Holidays({super.key});
@@ -56,7 +61,7 @@ class _HolidaysState extends State {
),
actions: [
TextButton(child: const Text("ferien-api.de öffnen"), onPressed: () => ConfirmDialog.openBrowser(context, "https://ferien-api.de/")),
- TextButton(child: const Text("Schlißen"), onPressed: () => Navigator.of(context).pop()),
+ TextButton(child: const Text("Schließen"), onPressed: () => Navigator.of(context).pop()),
],
);
});
@@ -103,30 +108,39 @@ class _HolidaysState extends State {
List holidays = value.getHolidaysResponse.data;
if(!showPastEvents) holidays = holidays.where((element) => DateTime.parse(element.end).isAfter(DateTime.now())).toList();
+ if(holidays.isEmpty) return const PlaceholderView(icon: Icons.search_off, text: "Es wurden keine Ferieneinträge gefunden!");
+
return ListView.builder(
itemCount: holidays.length,
itemBuilder: (context, index) {
GetHolidaysResponseObject holiday = holidays[index];
+ String holidayType = holiday.name.split(" ").first.capitalize();
return ListTile(
- leading: const Icon(Icons.calendar_month),
- title: Text("${parseString(holiday.start)} bis ${parseString(holiday.end)}"),
- subtitle: Text("${holiday.name} - (${Jiffy.parse(holiday.start).fromNow()})"),
+ leading: const CenteredLeading(Icon(Icons.calendar_month)),
+ title: Text("$holidayType ab ${parseString(holiday.start)}"),
+ subtitle: Text("bis ${parseString(holiday.end)}"),
onTap: () => showDialog(context: context, builder: (context) => SimpleDialog(
- title: Text("Ferien in Hessen | ${holiday.year}"),
+ title: Text("$holidayType ${holiday.year} in Hessen"),
children: [
ListTile(
- leading: const Icon(Icons.signpost_outlined),
+ leading: const CenteredLeading(Icon(Icons.signpost_outlined)),
title: Text(holiday.name),
subtitle: Text(holiday.slug),
),
ListTile(
- leading: const Icon(Icons.event),
- title: Text("beginnend ${parseString(holiday.start)}"),
+ leading: const Icon(Icons.arrow_forward),
+ title: Text("vom ${parseString(holiday.start)}"),
),
ListTile(
- leading: const Icon(Icons.event_busy_outlined),
- title: Text("endend ${parseString(holiday.end)}"),
+ leading: const Icon(Icons.arrow_back),
+ title: Text("bis zum ${parseString(holiday.end)}"),
),
+ ListTile(
+ leading: const Icon(Icons.timer_outlined),
+ title: AnimatedTime(callback: () => DateTime.parse(holiday.start).difference(DateTime.now())),
+ subtitle: Text(Jiffy.parse(holiday.start).fromNow()),
+ ),
+ DebugTile(holiday.toJson()).asTile(context),
],
)),
trailing: const Icon(Icons.arrow_right),
diff --git a/lib/view/pages/more/overhang.dart b/lib/view/pages/more/overhang.dart
index aa3c0a6..052fec2 100644
--- a/lib/view/pages/more/overhang.dart
+++ b/lib/view/pages/more/overhang.dart
@@ -5,9 +5,9 @@ import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
import '../../../widget/ListItem.dart';
import '../../settings/settings.dart';
-import '../holidays/holidays.dart';
import 'countdown/countdown.dart';
import 'gradeAverages/gradeAverage.dart';
+import 'holidays/holidays.dart';
import 'message/message.dart';
import 'roomplan/roomplan.dart';
diff --git a/lib/widget/centeredLeading.dart b/lib/widget/centeredLeading.dart
new file mode 100644
index 0000000..e83596b
--- /dev/null
+++ b/lib/widget/centeredLeading.dart
@@ -0,0 +1,15 @@
+import 'package:flutter/material.dart';
+
+class CenteredLeading extends StatelessWidget {
+ final Widget child;
+ const CenteredLeading(this.child, {super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [child],
+ );
+ }
+}
diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc
index f6f23bf..7299b5c 100644
--- a/linux/flutter/generated_plugin_registrant.cc
+++ b/linux/flutter/generated_plugin_registrant.cc
@@ -6,9 +6,13 @@
#include "generated_plugin_registrant.h"
+#include
#include
void fl_register_plugins(FlPluginRegistry* registry) {
+ g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
+ file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake
index f16b4c3..786ff5c 100644
--- a/linux/flutter/generated_plugins.cmake
+++ b/linux/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
+ file_selector_linux
url_launcher_linux
)
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
index 7026e66..9d5f78f 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -6,6 +6,7 @@ import FlutterMacOS
import Foundation
import device_info_plus
+import file_selector_macos
import package_info
import path_provider_foundation
import shared_preferences_foundation
@@ -15,6 +16,7 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
+ FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc
index 9871f6b..779f0ee 100644
--- a/windows/flutter/generated_plugin_registrant.cc
+++ b/windows/flutter/generated_plugin_registrant.cc
@@ -6,10 +6,13 @@
#include "generated_plugin_registrant.h"
+#include
#include
#include
void RegisterPlugins(flutter::PluginRegistry* registry) {
+ FileSelectorWindowsRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("FileSelectorWindows"));
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(
diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake
index 2487723..3757972 100644
--- a/windows/flutter/generated_plugins.cmake
+++ b/windows/flutter/generated_plugins.cmake
@@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
+ file_selector_windows
syncfusion_pdfviewer_windows
url_launcher_windows
)