From 83ad7d59d2e9f8e36479d1ac55a1c45fc4789f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 29 Jan 2023 22:29:48 +0100 Subject: [PATCH] Implemented TimeTable --- .idea/libraries/Dart_Packages.xml | 110 +++++++++--------- .idea/libraries/Flutter_Plugins.xml | 27 +++-- lib/app.dart | 35 +++--- lib/data/incomingPacket.dart | 7 +- lib/data/incommingPackets/errorPacket.dart | 21 ++++ .../incommingPackets/timetablePacket.dart | 71 +++++++++++ lib/main.dart | 18 ++- lib/screen/pages/timetable/timetable.dart | 84 ++++++++++++- lib/screen/settings/settings.dart | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 +- pubspec.yaml | 1 + 11 files changed, 285 insertions(+), 93 deletions(-) create mode 100644 lib/data/incommingPackets/errorPacket.dart create mode 100644 lib/data/incommingPackets/timetablePacket.dart 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: