diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index fc47c09..b38194d 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -19,14 +19,14 @@
-
+
-
+
@@ -145,14 +145,14 @@
-
+
-
+
@@ -173,7 +173,7 @@
-
+
@@ -201,7 +201,7 @@
-
+
@@ -327,49 +327,42 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
+
@@ -390,7 +383,7 @@
-
+
@@ -450,6 +443,13 @@
+
+
+
+
+
+
+
@@ -467,35 +467,35 @@
-
+
-
+
-
+
-
+
-
+
@@ -509,14 +509,14 @@
-
+
-
+
@@ -530,7 +530,7 @@
-
+
@@ -544,14 +544,14 @@
-
+
-
+
@@ -574,8 +574,8 @@
-
-
+
+
@@ -591,13 +591,13 @@
-
-
-
+
+
+
-
+
@@ -615,16 +615,15 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
-
+
@@ -632,21 +631,22 @@
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
index cbb7192..68699cc 100644
--- a/.idea/libraries/Flutter_Plugins.xml
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -1,23 +1,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/app.dart b/lib/app.dart
index 7f66f15..943152c 100644
--- a/lib/app.dart
+++ b/lib/app.dart
@@ -37,19 +37,28 @@ class _AppState extends State {
)
],
),
- body: PageView(
- controller: pageController,
- children: const [
- Timetable(),
- Talk(),
- Files(),
- Overhang(),
+ body: Stack(
+ children: [
+ PageView(
+ controller: pageController,
+ children: const [
+ Timetable(),
+ Talk(),
+ Files(),
+ Overhang(),
+ ],
+ onPageChanged: (page) {
+ setState(() {
+ currentPage = page;
+ });
+ },
+ ),
+ // LinearProgressIndicator(
+ // backgroundColor: Colors.transparent,
+ // valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor),
+ // minHeight: 5,
+ // ),
],
- onPageChanged: (page) {
- setState(() {
- currentPage = page;
- });
- },
),
bottomNavigationBar: BottomNavigationBar(
@@ -91,7 +100,7 @@ class _AppState extends State {
],
), label: "Talk"),
const BottomNavigationBarItem(icon: Icon(Icons.folder), label: "Dateien"),
- const BottomNavigationBarItem(icon: Icon(Icons.list), label: "Mehr"),
+ const BottomNavigationBarItem(icon: Icon(Icons.more_horiz), label: "Mehr"),
],
selectedItemColor: Theme.of(context).primaryColor,
unselectedItemColor: Colors.grey,
diff --git a/lib/data/incomingPacket.dart b/lib/data/incomingPacket.dart
index 20a0fbe..72e1ecc 100644
--- a/lib/data/incomingPacket.dart
+++ b/lib/data/incomingPacket.dart
@@ -8,19 +8,20 @@ import 'package:marianum_mobile/data/socketConnection.dart';
class IncomingPacket extends ChangeNotifier {
String packetId;
+ bool useJsonDecode;
bool _isReceived = false;
bool get isReceived => _isReceived;
- IncomingPacket(this.packetId) {
- log("PACKETLISTENER ERSTELLT!");
+ IncomingPacket(this.packetId, {this.useJsonDecode = true}) {
SocketConnection.read.listen((event) {
if(event.startsWith("$packetId:")) {
_isReceived = true;
// THIS listener handles the incomming request
log("$packetId is handled!");
- handle(jsonDecode(event.split("$packetId:")[1]));
+ String content = event.split("$packetId:")[1];
+ handle(useJsonDecode ? jsonDecode(content) : content);
}
notifyListeners();
});
diff --git a/lib/data/incommingPackets/errorPacket.dart b/lib/data/incommingPackets/errorPacket.dart
new file mode 100644
index 0000000..588f4b6
--- /dev/null
+++ b/lib/data/incommingPackets/errorPacket.dart
@@ -0,0 +1,21 @@
+import 'package:marianum_mobile/data/incomingPacket.dart';
+
+class ErrorPacket extends IncomingPacket {
+ ErrorPacket() : super("error", useJsonDecode: false);
+
+ bool _errorDismissed = true;
+ bool get errorDismissed => _errorDismissed;
+ set errorDismissed(bool value) {
+ _errorDismissed = value;
+ notifyListeners();
+ }
+
+ String _errorText = "";
+ String get errorText => _errorText;
+
+ @override
+ void handle(data) {
+ _errorDismissed = false;
+ _errorText = data;
+ }
+}
\ No newline at end of file
diff --git a/lib/data/incommingPackets/timetablePacket.dart b/lib/data/incommingPackets/timetablePacket.dart
new file mode 100644
index 0000000..b8826b0
--- /dev/null
+++ b/lib/data/incommingPackets/timetablePacket.dart
@@ -0,0 +1,71 @@
+import 'dart:convert';
+
+import 'package:flutter/cupertino.dart';
+import 'package:marianum_mobile/data/socketConnection.dart';
+
+import '../incomingPacket.dart';
+
+class TimetablePacket extends IncomingPacket {
+ TimetablePacket() : super('timetable');
+
+ TimeTableData _timeTable = TimeTableData();
+ TimeTableData get timeTable => _timeTable;
+
+ @override
+ void handle(data) {
+ _timeTable = TimeTableData();
+ data.forEach((day) {
+ TimeTableDay dayData = TimeTableDay(List.empty(growable: true), day['title']);
+ day['tiles'].forEach((tile) {
+ dayData._entries.add(TimeTableEntry(
+ tile['title'], tile['title'], tile['room'], tile['title'],
+ TimeTableEntryTime(tile['begin']['hour'], tile['begin']['minute']),
+ TimeTableEntryTime(tile['end']['hour'], tile['end']['minute'])
+ ));
+ });
+
+ _timeTable._days.add(dayData);
+ });
+ }
+}
+
+class TimeTableData {
+ List _days = [];
+
+ List get days => _days;
+
+ set days(List value) {
+ _days = value;
+ }
+}
+
+class TimeTableDay {
+ List _entries;
+ String _name;
+
+ TimeTableDay(this._entries, this._name);
+
+ List get entries => _entries;
+ String get name => _name;
+
+}
+
+class TimeTableEntry {
+ late String subject;
+ late String teacher;
+ late String room;
+ late String classes;
+
+ late TimeTableEntryTime start;
+ late TimeTableEntryTime end;
+
+ TimeTableEntry(this.subject, this.teacher, this.room, this.classes,
+ this.start, this.end);
+}
+
+class TimeTableEntryTime {
+ int hour;
+ int minute;
+
+ TimeTableEntryTime(this.hour, this.minute);
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index 6c6c108..9f6a147 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:marianum_mobile/data/accountModel.dart';
import 'package:marianum_mobile/data/incommingPackets/authenticatePacket.dart';
+import 'package:marianum_mobile/data/incommingPackets/errorPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart';
import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart';
@@ -17,6 +18,7 @@ import 'package:web_socket_channel/web_socket_channel.dart';
import 'app.dart';
import 'data/incommingPackets/serverInfoPacket.dart';
import 'data/incommingPackets/talkContactsPacket.dart';
+import 'data/incommingPackets/timetablePacket.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -30,11 +32,13 @@ Future main() async {
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => AccountModel()),
+ ChangeNotifierProvider(create: (context) => ErrorPacket()),
ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()),
ChangeNotifierProvider(create: (context) => FileListPacket()),
ChangeNotifierProvider(create: (context) => TalkChatPacket()),
+ ChangeNotifierProvider(create: (context) => TimetablePacket()),
],
child: const Main(),
)
@@ -89,9 +93,17 @@ class _MainState extends State {
if(snapshot.hasData) {
- return Consumer(
- builder: (context, value, child) {
- return value.isLoggedIn ? const App() : const Login();
+ return Consumer2(
+ builder: (context, accountModel, errorPacket, child) {
+ if(errorPacket.errorDismissed) {
+ return accountModel.isLoggedIn ? const App() : const Login();
+ } else {
+ return AlertDialog(title: const Text("Serverseitige Fehlermeldung"), content: Text(errorPacket.errorText), actions: [
+ TextButton(onPressed: () {
+ Provider.of(context, listen: false).errorDismissed = true;
+ }, child: const Text("Weiter"))
+ ]);
+ }
},
);
diff --git a/lib/screen/pages/timetable/timetable.dart b/lib/screen/pages/timetable/timetable.dart
index d72347a..6e756a6 100644
--- a/lib/screen/pages/timetable/timetable.dart
+++ b/lib/screen/pages/timetable/timetable.dart
@@ -1,6 +1,12 @@
+import 'dart:developer';
+
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
+import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
+import 'package:marianum_mobile/widget/loadingPacket.dart';
+import 'package:provider/provider.dart';
+import 'package:timetable_view/timetable_view.dart';
class Timetable extends StatefulWidget {
const Timetable({Key? key}) : super(key: key);
@@ -13,15 +19,87 @@ class _TimetableState extends State {
@override
void initState() {
+ Provider.of(context, listen: false).invoke();
super.initState();
}
@override
Widget build(BuildContext context) {
- List chats = List.empty(growable: true);
+ return Consumer(
+ builder: (context, data, child) {
- return const Center(
- child: Text("Not supported"),
+ return LoadingPacket(packet: data, child: TimetableView(
+ laneEventsList: _buildLaneEvents(context, data),
+ onEventTap: (TableEvent event) {},
+ timetableStyle: CustomTableStyle(context),
+ onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
+ ));
+ },
);
}
+
+ List _buildLaneEvents(context, TimetablePacket data) {
+ List laneEvents = List.empty(growable: true);
+ data.timeTable.days.forEach((day) {
+ List tableEvents = List.empty(growable: true);
+
+ day.entries.forEach((element) {
+ tableEvents.add(
+ TableEvent(
+ backgroundColor: Theme.of(context).primaryColor,
+ padding: const EdgeInsets.all(5),
+ title: element.subject,
+ location: "\n${element.room}",
+ eventId: tableEvents.length,
+ laneIndex: tableEvents.length,
+ startTime: TableEventTime(hour: element.start.hour, minute: element.start.minute),
+ endTime: TableEventTime(hour: element.end.hour, minute: element.end.minute)
+ )
+ );
+ });
+
+ laneEvents.add(
+ LaneEvents(
+ lane: Lane(laneIndex: laneEvents.length, name: day.name, textStyle: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold)),
+ events: tableEvents
+ )
+ );
+ });
+
+
+ return laneEvents;
+ }
+
+ void onEventTapCallBack(TableEvent event) {
+ print(
+ "Event Clicked!! LaneIndex ${event.laneIndex} Title: ${event.title} StartHour: ${event.startTime.hour} EndHour: ${event.endTime.hour}");
+ }
+
+ void onTimeSlotTappedCallBack(
+ int laneIndex, TableEventTime start, TableEventTime end) {
+ print(
+ "Empty Slot Clicked !! LaneIndex: $laneIndex StartHour: ${start.hour} EndHour: ${end.hour}");
+ }
}
+
+class CustomTableStyle extends TimetableStyle {
+ dynamic context;
+ CustomTableStyle(context) {
+ this.context = context;
+ }
+
+
+ @override
+ int get startHour => 07;
+ @override
+ int get endHour => 17;
+ @override
+ double get laneWidth => 200;
+ @override
+ Color get cornerColor => Theme.of(this.context).primaryColor;
+ @override
+ Color get timeItemTextColor => Theme.of(this.context).primaryColor;
+ @override
+ // TODO: implement timeItemHeight
+ double get timeItemHeight => 60;
+}
\ No newline at end of file
diff --git a/lib/screen/settings/settings.dart b/lib/screen/settings/settings.dart
index ca76c4b..47caa2c 100644
--- a/lib/screen/settings/settings.dart
+++ b/lib/screen/settings/settings.dart
@@ -19,7 +19,7 @@ class _SettingsState extends State {
@override
void initState() {
super.initState();
- ServerInfoPacket().invoke();
+ Provider.of(context, listen: false).invoke();
}
@override
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
index 8ad28b4..997e35d 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -5,7 +5,7 @@
import FlutterMacOS
import Foundation
-import shared_preferences_macos
+import shared_preferences_foundation
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
diff --git a/pubspec.yaml b/pubspec.yaml
index 8e37d02..a0e0e84 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -45,6 +45,7 @@ dependencies:
provider: ^6.0.4
web_socket_channel: ^2.2.0
jiffy: ^5.0.0
+ timetable_view: ^0.3.0
dev_dependencies:
flutter_test: