From 223414559ef38c89b3131f04aace792a5a2df01d Mon Sep 17 00:00:00 2001 From: Denys Konovalov Date: Tue, 16 Nov 2021 19:41:35 +0100 Subject: [PATCH] ==0.7.5-nightly 2021-11-16== - added strapi connector - cleanup code - updated readme - TODO: - update license & copyright info - cleanup code - merge code parts to server side - complete settings - fix 11/12 - add caching - muuuuuuuch more... --- lib/Settings/Pages/appearance_settings.dart | 8 +- lib/Settings/Pages/dev_settings.dart | 13 +- lib/Settings/Pages/info_settings.dart | 64 +- lib/Settings/Pages/plan_settings.dart | 92 +-- lib/Settings/Pages/service_settings.dart | 8 +- lib/Settings/Pages/user_settings.dart | 60 +- lib/Settings/dashboard.dart | 41 +- lib/dashboard.dart | 642 ++++++------------ lib/login.dart | 2 +- lib/main.dart | 3 +- lib/networking.dart | 136 ++-- .../colors.dart} | 2 +- .../subjects.dart} | 6 +- .../teachers.dart} | 2 +- lib/raumuebersicht.dart | 2 +- lib/schuelerzeitung.dart | 126 +++- lib/schulbibliothek.dart | 2 +- lib/schulcomputer.dart | 2 +- lib/timetable.dart | 131 ++-- pubspec.yaml | 6 +- 20 files changed, 614 insertions(+), 734 deletions(-) rename lib/{color_presets.dart => presets/colors.dart} (99%) rename lib/{subject_presets.dart => presets/subjects.dart} (96%) rename lib/{teacher_presets.dart => presets/teachers.dart} (99%) diff --git a/lib/Settings/Pages/appearance_settings.dart b/lib/Settings/Pages/appearance_settings.dart index 1ef4a89..a379840 100644 --- a/lib/Settings/Pages/appearance_settings.dart +++ b/lib/Settings/Pages/appearance_settings.dart @@ -4,8 +4,6 @@ import 'package:flutter/material.dart'; class AppearanceSettings extends StatelessWidget { const AppearanceSettings({Key? key}) : super(key: key); - - @override Widget build(BuildContext context) { return Scaffold( @@ -15,9 +13,7 @@ class AppearanceSettings extends StatelessWidget { ), body: ListView( padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), - children: [ - - ], + children: [], )); } -} \ No newline at end of file +} diff --git a/lib/Settings/Pages/dev_settings.dart b/lib/Settings/Pages/dev_settings.dart index 1ef8f54..3569097 100644 --- a/lib/Settings/Pages/dev_settings.dart +++ b/lib/Settings/Pages/dev_settings.dart @@ -27,16 +27,16 @@ class DevSettings extends StatelessWidget { ), onSubmitted: (String value) async { SharedPreferences prefs = - await SharedPreferences.getInstance(); + await SharedPreferences.getInstance(); String apiKey = value; await prefs.setString('api_key', apiKey); final snackBar = SnackBar( - content: Text('Neuer API-Schlüssel gesetzt: $apiKey')); + content: + Text('Neuer API-Schlüssel gesetzt: $apiKey')); // Find the ScaffoldMessenger in the widget tree // and use it to show a SnackBar. - ScaffoldMessenger.of(context) - .showSnackBar(snackBar); + ScaffoldMessenger.of(context).showSnackBar(snackBar); })), const Divider(), Padding( @@ -49,9 +49,8 @@ class DevSettings extends StatelessWidget { ); }, child: const Text("Benutzerdaten neu laden"), - ) - ) + )) ], )); } -} \ No newline at end of file +} diff --git a/lib/Settings/Pages/info_settings.dart b/lib/Settings/Pages/info_settings.dart index 76358ca..e7ee51b 100644 --- a/lib/Settings/Pages/info_settings.dart +++ b/lib/Settings/Pages/info_settings.dart @@ -5,8 +5,6 @@ import 'package:MeinCantor/const.dart'; class InfoSettings extends StatelessWidget { const InfoSettings({Key? key}) : super(key: key); - - @override Widget build(BuildContext context) { return Scaffold( @@ -18,10 +16,9 @@ class InfoSettings extends StatelessWidget { padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), children: [ const ListTile( - leading: Icon(Icons.info_outlined), - title: Text("Version"), - subtitle: Text(version) - ), + leading: Icon(Icons.info_outlined), + title: Text("Version"), + subtitle: Text(version)), ListTile( leading: const Icon(Icons.settings_backup_restore_outlined), title: const Text("Änderungsverlauf"), @@ -34,42 +31,45 @@ class InfoSettings extends StatelessWidget { height: 400, //color: Colors.amber, child: Column( - //mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - AppBar( - title: const Text("Änderungsverlauf"), - ), - const Padding( - padding: EdgeInsets.all(10), - child: Text(""), - ), - /*ElevatedButton( + //mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + AppBar( + title: const Text("Änderungsverlauf"), + ), + const Padding( + padding: EdgeInsets.all(10), + child: Text(""), + ), + /*ElevatedButton( child: const Text('Close BottomSheet'), onPressed: () => Navigator.pop(context), )*/ - ], - ), + ], + ), ); }, ); }, ), ListTile( - leading: const Icon(Icons.copyright_outlined), - title: const Text("Lizenzen"), - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => LicensePage( - applicationIcon: Image.asset("assets/images/meincantor_r.png", - height: 64, width: 64), - applicationVersion: version, - )), - ); - }, + leading: const Icon(Icons.copyright_outlined), + title: const Text("Lizenzen"), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LicensePage( + applicationIcon: Image.asset( + "assets/images/meincantor_r.png", + height: 64, + width: 64), + applicationVersion: version, + )), + ); + }, ), ], )); } -} \ No newline at end of file +} diff --git a/lib/Settings/Pages/plan_settings.dart b/lib/Settings/Pages/plan_settings.dart index a4d3ac8..0c4313b 100644 --- a/lib/Settings/Pages/plan_settings.dart +++ b/lib/Settings/Pages/plan_settings.dart @@ -8,10 +8,10 @@ import 'package:cyclop/cyclop.dart'; import 'package:MeinCantor/networking.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../color_presets.dart'; -import 'package:MeinCantor/subject_presets.dart'; +import 'package:MeinCantor/presets/colors.dart'; +import 'package:MeinCantor/presets/subjects.dart'; -import '../../teacher_presets.dart'; +import 'package:MeinCantor/presets/teachers.dart'; class PlanSettings extends StatefulWidget { const PlanSettings({Key? key}) : super(key: key); @@ -39,7 +39,12 @@ Future> buildLessonsList() async { } class _PlanSettingsState extends State { - Set swatches = {...Colors.primaries, ...Colors.accents, Palette.accent, Palette.primary}; + Set swatches = { + ...Colors.primaries, + ...Colors.accents, + Palette.accent, + Palette.primary + }; @override Widget build(BuildContext context) { @@ -63,51 +68,49 @@ class _PlanSettingsState extends State { for (var element in (snapshot.data as List)) { String subject = element['subject']; String teacher = element['teacher']; - children.add(FutureBuilder( - future: buildPlanColors(subject), - builder: (context, snapshot) { - if (snapshot.hasData) { - Color color = snapshot.data as Color; - return ListTile( - leading: ColorButton( - key: const Key('c1'), - color: color, - config: const ColorPickerConfig( - enableEyePicker: false), - onSwatchesChanged: (Set value) { - swatches = value; - }, - size: 32, - swatches: swatches, - onColorChanged: (Color value) async { - setState(() { - color = value; - }); - SharedPreferences prefs = await SharedPreferences - .getInstance(); - prefs.setInt( - "color$subject", value.value); - } - ), - title: Text(names[subject] ?? ""), - subtitle: Text(teachers[teacher] ?? ""), - ); - } else { - return (const LinearProgressIndicator()); - } - } - ), + children.add( + FutureBuilder( + future: buildPlanColors(subject), + builder: (context, snapshot) { + if (snapshot.hasData) { + Color color = snapshot.data as Color; + return ListTile( + leading: ColorButton( + key: const Key('c1'), + color: color, + config: const ColorPickerConfig( + enableEyePicker: false), + onSwatchesChanged: (Set value) { + swatches = value; + }, + size: 32, + swatches: swatches, + onColorChanged: (Color value) async { + setState(() { + color = value; + }); + SharedPreferences prefs = + await SharedPreferences + .getInstance(); + prefs.setInt( + "color$subject", value.value); + }), + title: Text(subjects[subject] ?? ""), + subtitle: Text(teachers[teacher] ?? ""), + ); + } else { + return (const LinearProgressIndicator()); + } + }), ); } return Column( children: children, ); } else { - return (const Center( - child: CircularProgressIndicator())); + return (const Center(child: CircularProgressIndicator())); } - } - ), + }), /*FutureBuilder( future: buildPlanColors("Mat"), builder: (context, snapshot) { @@ -171,7 +174,6 @@ class _PlanSettingsState extends State { } ),*/ ], - ) - ); + )); } -} \ No newline at end of file +} diff --git a/lib/Settings/Pages/service_settings.dart b/lib/Settings/Pages/service_settings.dart index f7a43fd..d2d583f 100644 --- a/lib/Settings/Pages/service_settings.dart +++ b/lib/Settings/Pages/service_settings.dart @@ -4,8 +4,6 @@ import 'package:flutter/material.dart'; class ServiceSettings extends StatelessWidget { const ServiceSettings({Key? key}) : super(key: key); - - @override Widget build(BuildContext context) { return Scaffold( @@ -15,9 +13,7 @@ class ServiceSettings extends StatelessWidget { ), body: ListView( padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), - children: [ - - ], + children: [], )); } -} \ No newline at end of file +} diff --git a/lib/Settings/Pages/user_settings.dart b/lib/Settings/Pages/user_settings.dart index 2e97080..8fb9a98 100644 --- a/lib/Settings/Pages/user_settings.dart +++ b/lib/Settings/Pages/user_settings.dart @@ -17,7 +17,6 @@ class UserSettings extends StatelessWidget { @override Widget build(BuildContext context) { - //TextEditingController nameController = TextEditingController(text: "Denys Konovalov"); return Scaffold( appBar: AppBar( @@ -28,41 +27,38 @@ class UserSettings extends StatelessWidget { padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Container( - width: 128.0, - height: 128.0, - decoration: const BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - fit: BoxFit.scaleDown, - image: AssetImage("assets/images/meincantor_r.png") - ) - ) - ), + padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Container( + width: 128.0, + height: 128.0, + decoration: const BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.scaleDown, + image: + AssetImage("assets/images/meincantor_r.png")))), ), FutureBuilder( - future: getSettingsString("name"), - builder: (context, snapshot) { - if (snapshot.hasData) { - return TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Name', - ), - readOnly: true, - controller: TextEditingController(text: snapshot.data as String), - ); - } else { - return (const Center(child: CircularProgressIndicator())); - } - } - ), + future: getSettingsString("name"), + builder: (context, snapshot) { + if (snapshot.hasData) { + return TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Name', + ), + readOnly: true, + controller: + TextEditingController(text: snapshot.data as String), + ); + } else { + return (const Center(child: CircularProgressIndicator())); + } + }), Padding( padding: const EdgeInsets.fromLTRB(5, 20, 5, 5), - child: buildClassesChooser() - ), + child: buildClassesChooser()), ], )); } -} \ No newline at end of file +} diff --git a/lib/Settings/dashboard.dart b/lib/Settings/dashboard.dart index fcf51ae..fa176df 100644 --- a/lib/Settings/dashboard.dart +++ b/lib/Settings/dashboard.dart @@ -23,7 +23,8 @@ class Settings extends StatelessWidget { padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), children: [ ListTile( - leading: const Icon(MdiIcons.accountSettingsOutline, color: Colors.cyan), + leading: const Icon(MdiIcons.accountSettingsOutline, + color: Colors.cyan), trailing: const Icon(Icons.arrow_forward_ios, size: 16), title: const Text("Benutzer"), subtitle: const Text("Profilbild, Klasse & mehr"), @@ -35,7 +36,8 @@ class Settings extends StatelessWidget { }, ), ListTile( - leading: const Icon(MdiIcons.timetable, color: Colors.orangeAccent), + leading: + const Icon(MdiIcons.timetable, color: Colors.orangeAccent), trailing: const Icon(Icons.arrow_forward_ios, size: 16), title: const Text("Plan"), subtitle: const Text("Kurse/Fächer, Farben & mehr"), @@ -47,14 +49,16 @@ class Settings extends StatelessWidget { }, ), ListTile( - leading: const Icon(Icons.color_lens_outlined, color: Colors.pinkAccent), + leading: const Icon(Icons.color_lens_outlined, + color: Colors.pinkAccent), trailing: const Icon(Icons.arrow_forward_ios, size: 16), title: const Text("Aussehen"), subtitle: const Text("Widgets, Design & mehr"), onTap: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => const AppearanceSettings()), + MaterialPageRoute( + builder: (context) => const AppearanceSettings()), ); }, ), @@ -66,24 +70,27 @@ class Settings extends StatelessWidget { onTap: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => const ServiceSettings()), + MaterialPageRoute( + builder: (context) => const ServiceSettings()), ); }, ), ListTile( - leading: const Icon(Icons.developer_mode_outlined, color: Colors.deepOrangeAccent), - trailing: const Icon(Icons.arrow_forward_ios, size: 16), - title: const Text("Entwickleroptionen"), - subtitle: const Text("API, Benutzerdaten & mehr"), - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const DevSettings()), - ); - }, + leading: const Icon(Icons.developer_mode_outlined, + color: Colors.deepOrangeAccent), + trailing: const Icon(Icons.arrow_forward_ios, size: 16), + title: const Text("Entwickleroptionen"), + subtitle: const Text("API, Benutzerdaten & mehr"), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const DevSettings()), + ); + }, ), ListTile( - leading: const Icon(Icons.info_outlined, color: Colors.greenAccent), + leading: + const Icon(Icons.info_outlined, color: Colors.greenAccent), trailing: const Icon(Icons.arrow_forward_ios, size: 16), title: const Text("Informationen"), subtitle: const Text("Version, Lizenzen & mehr"), @@ -97,4 +104,4 @@ class Settings extends StatelessWidget { ], )); } -} \ No newline at end of file +} diff --git a/lib/dashboard.dart b/lib/dashboard.dart index f12c111..2ffe7a4 100644 --- a/lib/dashboard.dart +++ b/lib/dashboard.dart @@ -1,18 +1,17 @@ -//import 'package:MeinCantor/timetable.dart'; -//import 'package:MeinCantor/main.dart'; import 'package:MeinCantor/raumuebersicht.dart'; import 'package:MeinCantor/schulbibliothek.dart'; import 'package:MeinCantor/schulcomputer.dart'; +import 'package:MeinCantor/schuelerzeitung.dart'; +import 'package:MeinCantor/Settings/dashboard.dart'; + +import 'package:MeinCantor/main.dart'; +import 'package:MeinCantor/networking.dart'; +import 'package:MeinCantor/login.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'Settings/dashboard.dart'; -// import 'settings.dart'; -import 'main.dart'; -import 'networking.dart'; -import 'login.dart'; -import 'schuelerzeitung.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class Dashboard extends StatefulWidget { @@ -30,7 +29,6 @@ Future getSettingsString(String key) async { if (value == null || value.isEmpty) { value = ""; } - print(value); return value; } @@ -53,19 +51,16 @@ class _DashboardState extends State with RestorationMixin { final drawerElements = ListView( children: [ UserAccountsDrawerHeader( - accountName: buildSettingsString('name', const TextStyle()), - accountEmail: buildSettingsString('user', const TextStyle()), - currentAccountPicture: Image.asset("assets/images/meincantor_r.png") - /*const CircularProgressIndicator( - backgroundColor: Colors.black, - ),*/ - ), + accountName: buildSettingsString('name', const TextStyle()), + accountEmail: buildSettingsString('user', const TextStyle()), + currentAccountPicture: + Image.asset("assets/images/meincantor_r.png")), ListTile( title: const Text("Einstellungen"), onTap: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => Settings()), + MaterialPageRoute(builder: (context) => const Settings()), ); }, leading: const Icon(Icons.settings_outlined), @@ -90,12 +85,9 @@ class _DashboardState extends State with RestorationMixin { label: "Startseite", ), const BottomNavigationBarItem( - icon: Icon(MdiIcons.timetable), - label: "Vertretungsplan"), + icon: Icon(MdiIcons.timetable), label: "Vertretungsplan"), const BottomNavigationBarItem( - icon: Icon(Icons.notifications_outlined), - label: "Hinweise" - ), + icon: Icon(Icons.notifications_outlined), label: "Hinweise"), ]; return Scaffold( appBar: AppBar( @@ -115,7 +107,6 @@ class _DashboardState extends State with RestorationMixin { setState(() { _currentIndex.value = index; }); - //print(index); }, ), ); @@ -139,47 +130,47 @@ class _DashboardBottomNavView extends StatelessWidget { Widget build(BuildContext context) { if (item.label == "Startseite") { double _timeOfDayToDouble(TimeOfDay tod) => tod.hour + tod.minute / 60.0; - var lessonCount; + int lessonCount; if (_timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 7, minute: 30))) { lessonCount = 1; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 7, minute: 30)) && + _timeOfDayToDouble(const TimeOfDay(hour: 7, minute: 30)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 8, minute: 20))) { lessonCount = 2; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 8, minute: 20)) && + _timeOfDayToDouble(const TimeOfDay(hour: 8, minute: 20)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 9, minute: 25))) { lessonCount = 3; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 9, minute: 25)) && + _timeOfDayToDouble(const TimeOfDay(hour: 9, minute: 25)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 10, minute: 15))) { lessonCount = 4; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 10, minute: 15)) && + _timeOfDayToDouble(const TimeOfDay(hour: 10, minute: 15)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 11, minute: 30))) { lessonCount = 5; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 11, minute: 30)) && + _timeOfDayToDouble(const TimeOfDay(hour: 11, minute: 30)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 12, minute: 20))) { lessonCount = 6; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 12, minute: 20)) && + _timeOfDayToDouble(const TimeOfDay(hour: 12, minute: 20)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 13, minute: 30))) { lessonCount = 7; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 13, minute: 30)) && + _timeOfDayToDouble(const TimeOfDay(hour: 13, minute: 30)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 14, minute: 20))) { lessonCount = 8; } else if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: 14, minute: 20)) && + _timeOfDayToDouble(const TimeOfDay(hour: 14, minute: 20)) && _timeOfDayToDouble(TimeOfDay.now()) <= _timeOfDayToDouble(const TimeOfDay(hour: 15, minute: 10))) { lessonCount = 9; @@ -187,409 +178,216 @@ class _DashboardBottomNavView extends StatelessWidget { lessonCount = -1; } - /* - Widget timetable; - if (_timeOfDayToDouble(TimeOfDay.now()) > - _timeOfDayToDouble(const TimeOfDay(hour: , minute: 55))) { - timetable = buildClassTimetable(); - } else { - timetable = buildTodayClassTimetable(); - } - */ - - print(lessonCount); var view = SingleChildScrollView( - child: Column( + child: Column(children: [ + Row( + mainAxisSize: MainAxisSize.max, children: [ - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20, 30, 20, 5), - child: Text( - 'Hallo,', - style: GoogleFonts.robotoSlab( - fontSize: 20, - ), - ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 30, 20, 5), + child: Text( + 'Hallo,', + style: GoogleFonts.robotoSlab( + fontSize: 20, ), - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20, 5, 20, 20), - child: buildSettingsString( - "name", - GoogleFonts.robotoSlab( - fontSize: 28, - fontWeight: FontWeight.w800, - ), - ), - ) - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(20, 10, 0, 10), - child: Text( - 'Deine nächste Unterrichtsstunde:', - style: GoogleFonts.robotoSlab( - fontSize: 20, - fontWeight: FontWeight.w100, - ), - ), - ) - ], + ), ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ Padding( - padding: const EdgeInsets.fromLTRB(20, 20, 20, 10), - child: buildTodayClassTimetableLesson(lessonCount), - ), + padding: const EdgeInsets.fromLTRB(20, 5, 20, 20), + child: buildSettingsString( + "name", + GoogleFonts.robotoSlab( + fontSize: 28, + fontWeight: FontWeight.w800, + ), + ), + ) + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ Padding( - padding: const EdgeInsets.fromLTRB(20, 20, 20, 10), - child: Wrap( - children: [ - SizedBox( - child: GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SZ()), - ); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: const Padding( - padding: EdgeInsets.all(10), - child: ListTile( - title: Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 10), - child: Icon( - MdiIcons.newspaper, - color: Palette.accent, - size: 48, - ), - ), - subtitle: Center( - child: Padding( - padding: EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Text( - 'Schülerzeitung', - ), - ), - ), - ), - ) - ), - ), - width: 175, + padding: const EdgeInsets.fromLTRB(20, 10, 0, 10), + child: Text( + 'Deine nächste Unterrichtsstunde:', + style: GoogleFonts.robotoSlab( + fontSize: 20, + fontWeight: FontWeight.w100, + ), + ), + ) + ], + ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 10), + child: buildTodayClassTimetableLesson(lessonCount), + ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 10), + child: Wrap( + children: [ + SizedBox( + child: GestureDetector( + onTap: () async { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SZ()), + ); + }, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), ), - SizedBox( - width: 175, - child: GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SB()), - ); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: const Padding( - padding: EdgeInsets.all(10), - child: ListTile( - title: Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 10), - child: Icon( - MdiIcons.libraryShelves, - color: Palette.accent, - size: 48, - ), - ), - subtitle: Center( - child: Padding( - padding: EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Text( - 'Schulbibliothek', - ), - ), - ), - ), - ) - ), - ), - ), - SizedBox( - width: 175, - child: GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SC()), - ); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: const Padding( - padding: EdgeInsets.all(10), - child: ListTile( - title: Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 10), - child: Icon( - MdiIcons.laptop, - color: Palette.accent, - size: 48, - ), - ), - subtitle: Center( - child: Padding( - padding: EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Text( - 'Schulcomputer', - ), - ), - ), - ), - ) - ), - ), - ), - SizedBox( - width: 175, - child: GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const RoomOverview()), - ); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: const Padding( - padding: EdgeInsets.all(10), - child: ListTile( - title: Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 10), - child: Icon( - MdiIcons.door, - color: Palette.accent, - size: 48, - ), - ), - subtitle: Center( - child: Padding( - padding: EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Text( - 'Raumübersicht', - ), - ), - ), - ), - ) - ), - ), - ) - /*GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SZ()), - ); - }, - child: Card( - clipBehavior: Clip.antiAliasWithSaveLayer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - //mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(20, 20, 20, 10), - child: Icon( - MdiIcons.newspaper, - color: Palette.accent, - size: 48, - ), - ) - ], - ), - Row( - //mainAxisSize: MainAxisSize.max, - children: const [ - Align( - alignment: Alignment(0, 0), - child: Padding( - padding: EdgeInsets.fromLTRB(15, 50, 15, 15), - child: Text( - 'Schülerzeitung', - ), - ), - ), - ], - ) - ], - ), - ), - ), - GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SB()), - ); - }, - child: Card( - clipBehavior: Clip.antiAliasWithSaveLayer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(20, 20, 20, 10), - child: Icon( - MdiIcons.libraryShelves, - color: Color(0xFFFFBC3B), - size: 48, - ), - ) - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(15, 50, 15, 15), - child: Text( - 'Schulbibliothek', - ), - ) - ], - ) - ], + child: const Padding( + padding: EdgeInsets.all(10), + child: ListTile( + title: Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + child: Icon( + MdiIcons.newspaper, + color: Palette.accent, + size: 48, ), - ) - ), - ), - GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SC()), - ); - }, - child: Card( - clipBehavior: Clip.antiAliasWithSaveLayer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(20, 20, 20, 10), - child: Icon( - MdiIcons.laptop, - color: Color(0xFFFFBC3B), - size: 48, - ), - ) - ], + subtitle: Center( + child: Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Text( + 'Schülerzeitung', ), - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(15, 50, 15, 15), - child: Text( - 'Schulcomputer', - ), - ) - ], - ) - ], + ), ), ), - ), - GestureDetector( - onTap: () async { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const RoomOverview()), - ); - }, - child: Card( - clipBehavior: Clip.antiAliasWithSaveLayer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(20, 20, 20, 10), - child: Icon( - MdiIcons.door, - color: Color(0xFFFFBC3B), - size: 48, - ), - ) - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: const [ - Padding( - padding: EdgeInsets.fromLTRB(15, 50, 15, 15), - child: Text( - 'Raumübersicht', - ), - ) - ], - ) - ], - ), - ), - ),*/ - ], - ), + )), ), - ]), - ); + width: 175, + ), + SizedBox( + width: 175, + child: GestureDetector( + onTap: () async { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SB()), + ); + }, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: ListTile( + title: Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + child: Icon( + MdiIcons.libraryShelves, + color: Palette.accent, + size: 48, + ), + ), + subtitle: Center( + child: Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Text( + 'Schulbibliothek', + ), + ), + ), + ), + )), + ), + ), + SizedBox( + width: 175, + child: GestureDetector( + onTap: () async { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SC()), + ); + }, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: ListTile( + title: Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + child: Icon( + MdiIcons.laptop, + color: Palette.accent, + size: 48, + ), + ), + subtitle: Center( + child: Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Text( + 'Schulcomputer', + ), + ), + ), + ), + )), + ), + ), + SizedBox( + width: 175, + child: GestureDetector( + onTap: () async { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const RoomOverview()), + ); + }, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: ListTile( + title: Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + child: Icon( + MdiIcons.door, + color: Palette.accent, + size: 48, + ), + ), + subtitle: Center( + child: Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Text( + 'Raumübersicht', + ), + ), + ), + ), + )), + ), + ) + ], + ), + ), + ]), + ); return view; } else if (item.label == "Vertretungsplan") { return LayoutBuilder(builder: (context, constraints) { double widgetWidth = constraints.maxWidth; - // double widgetHeight = constraints.maxHeight; - var factor; + + int factor; if (widgetWidth <= 600) { factor = 1; @@ -597,6 +395,8 @@ class _DashboardBottomNavView extends StatelessWidget { factor = 2; } else if (widgetWidth <= 2000) { factor = 3; + } else { + factor = 1; } // print(screenType); @@ -629,10 +429,6 @@ class _DashboardBottomNavView extends StatelessWidget { text: "Neuster Plan", icon: Icon(CupertinoIcons.calendar), ), - /*Tab( - text: "Archiv", - icon: Icon(CupertinoIcons.archivebox), - ),*/ ], ), ), @@ -652,4 +448,4 @@ class _DashboardBottomNavView extends StatelessWidget { return const Center(child: Text("Derzeit nichts hier...")); } } -} \ No newline at end of file +} diff --git a/lib/login.dart b/lib/login.dart index 4645f46..3f95187 100644 --- a/lib/login.dart +++ b/lib/login.dart @@ -151,7 +151,7 @@ class Login extends StatelessWidget { context, MaterialPageRoute( builder: (context) => - const Dashboard()), + const Dashboard()), ); }); } diff --git a/lib/main.dart b/lib/main.dart index be35f69..b99e9d9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,7 +46,8 @@ class App extends StatelessWidget { ), ), darkTheme: ThemeData.from( - colorScheme: const ColorScheme.dark(primary: Palette.accent, secondary: Palette.accent)), + colorScheme: const ColorScheme.dark( + primary: Palette.accent, secondary: Palette.accent)), title: "GCG.MeinCantor", home: buildHomePage(), ); diff --git a/lib/networking.dart b/lib/networking.dart index 7bd0f8b..7f8e93b 100644 --- a/lib/networking.dart +++ b/lib/networking.dart @@ -5,9 +5,20 @@ import 'package:flutter/painting.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'timetable.dart'; -import 'login.dart'; -import 'main.dart'; +import 'package:MeinCantor/const.dart'; +import 'package:MeinCantor/timetable.dart'; +import 'package:MeinCantor/login.dart'; +import 'package:MeinCantor/main.dart'; + +Future getArticles() async { + print("hjkl0"); + var uri = Uri.https(szUrl["url"]!, "/articles"); + print(uri.toString()); + final response = await http.get(uri); + print("hji"); + print(response); + return (response); +} Future getToken( String user, String password, String otp, String devId) async { @@ -47,7 +58,9 @@ Future fetchClassTimetable() async { var uri = Uri.https("mein.cantorgymnasium.de", "/api/timetable/$classNum"); var headers = {"x-api-key": "$apiKey"}; print(uri); - final response = http.get(uri, headers: headers).onError((error, stackTrace) { return(http.Response("", 404)); } ); + final response = http.get(uri, headers: headers).onError((error, stackTrace) { + return (http.Response("", 404)); + }); return response; } @@ -65,7 +78,9 @@ Future fetchTodayClassTimetable() async { Uri.https("mein.cantorgymnasium.de", "/api/timetable/$classNum/today"); var headers = {"x-api-key": "$apiKey"}; print(uri); - final response = http.get(uri, headers: headers).onError((error, stackTrace) { return(http.Response("", 404)); } ); + final response = http.get(uri, headers: headers).onError((error, stackTrace) { + return (http.Response("", 404)); + }); return response; } @@ -80,10 +95,12 @@ Future fetchTomorrowClassTimetable() async { } var apiKey = prefs.getString('api_key'); var uri = - Uri.https("mein.cantorgymnasium.de", "/api/timetable/$classNum/tomorrow"); + Uri.https("mein.cantorgymnasium.de", "/api/timetable/$classNum/tomorrow"); var headers = {"x-api-key": "$apiKey"}; print(uri); - final response = http.get(uri, headers: headers).onError((error, stackTrace) { return(http.Response("", 404)); } ); + final response = http.get(uri, headers: headers).onError((error, stackTrace) { + return (http.Response("", 404)); + }); return response; } @@ -98,7 +115,10 @@ fetchLessonList() async { var apiKey = prefs.getString('api_key'); var uri = Uri.https("mein.cantorgymnasium.de", "/api/lessons/$classNum"); var headers = {"x-api-key": "$apiKey"}; - final response = await http.get(uri, headers: headers).onError((error, stackTrace) { return(http.Response("", 404)); } ); + final response = + await http.get(uri, headers: headers).onError((error, stackTrace) { + return (http.Response("", 404)); + }); if (response.statusCode == 200) { prefs.setString("lessons", utf8.decode(response.bodyBytes)); } else { @@ -106,8 +126,6 @@ fetchLessonList() async { } } - - Widget buildClassTimetable() { return FutureBuilder( future: fetchClassTimetable(), @@ -117,7 +135,8 @@ Widget buildClassTimetable() { if (statusCode == 200) { Widget timetableView = ClassTimetableBuilder.buildView( jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), context) - .view.child; + .view + .child; return timetableView; } else if (statusCode == 400) { Navigator.pushReplacement( @@ -125,12 +144,15 @@ Widget buildClassTimetable() { } else if (statusCode == 500) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Es konnte kein Vertretungsplan gefunden werden.")), + child: Center( + child: Text("Es konnte kein Vertretungsplan gefunden werden.")), ); } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), ); } return Center(child: Text('Error $statusCode')); @@ -152,23 +174,23 @@ Widget buildTodayClassTimetable() { if (statusCode == 200) { Widget timetableView = ClassTimetableBuilder.buildView( jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), context) - .view.child; + .view + .child; return timetableView; } else if (statusCode == 400) { Navigator.push( context, MaterialPageRoute(builder: (context) => Login())); } else if (statusCode == 500) { - var chars = Runes('Es konnte kein Vertretungsplan für heute gefunden werden. \u{1F937}'); + var chars = Runes( + 'Es konnte kein Vertretungsplan für heute gefunden werden. \u{1F937}'); List cardChildren = []; cardChildren.add(ListTile( - title: Text(String.fromCharCodes(chars), - style: const TextStyle(color: Palette.primary)), - ) - ); + title: Text(String.fromCharCodes(chars), + style: const TextStyle(color: Palette.primary)), + )); Card card = Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), - ), color: Colors.white, child: Column( @@ -178,12 +200,13 @@ Widget buildTodayClassTimetable() { padding: EdgeInsets.fromLTRB(20, 20, 20, 20), child: ListView( children: [card], - ) - ); + )); } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), ); } return Center(child: Text('Error $statusCode')); @@ -204,24 +227,24 @@ Widget buildTomorrowClassTimetable() { int statusCode = snapshot.data!.statusCode; if (statusCode == 200) { Widget timetableView = ClassTimetableBuilder.buildView( - jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), context) - .view.child; + jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), context) + .view + .child; return timetableView; } else if (statusCode == 400) { Navigator.push( context, MaterialPageRoute(builder: (context) => Login())); } else if (statusCode == 500) { - var chars = Runes('Es konnte kein Vertretungsplan für morgen gefunden werden. \u{1F937}'); + var chars = Runes( + 'Es konnte kein Vertretungsplan für morgen gefunden werden. \u{1F937}'); List cardChildren = []; cardChildren.add(ListTile( title: Text(String.fromCharCodes(chars), style: const TextStyle(color: Palette.primary)), - ) - ); + )); Card card = Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), - ), color: Colors.white, child: Column( @@ -231,8 +254,7 @@ Widget buildTomorrowClassTimetable() { padding: EdgeInsets.fromLTRB(20, 20, 20, 20), child: ListView( children: [card], - ) - ); + )); /*return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), child: Center(child: Text("Es konnte kein Vertretungsplan für heute gefunden werden.")), @@ -240,7 +262,9 @@ Widget buildTomorrowClassTimetable() { } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support.")), ); } return Center(child: Text('Error $statusCode')); @@ -261,19 +285,20 @@ Widget buildClassTimetableLesson(int count) { int statusCode = snapshot.data!.statusCode; if (statusCode == 200) { List lessons = LessonsListBuilder.buildList( - jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), count: count) + jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), + count: count) .lessons; return Column(children: lessons); } else if (statusCode == 400) { Navigator.push( context, MaterialPageRoute(builder: (context) => Login())); } else if (statusCode == 500) { - var chars = Runes('Es konnte kein Vertretungsplan für gefunden werden. \u{1F937}'); + var chars = Runes( + 'Es konnte kein Vertretungsplan für gefunden werden. \u{1F937}'); List cardChildren = []; cardChildren.add(ListTile( title: Text(String.fromCharCodes(chars), - style: const TextStyle(color: Palette.primary)) - )); + style: const TextStyle(color: Palette.primary)))); Card card = Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), @@ -290,7 +315,9 @@ Widget buildClassTimetableLesson(int count) { } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), ); } return Center(child: Text('Error $statusCode')); @@ -311,17 +338,18 @@ Widget buildTodayClassTimetableLesson(int count) { int statusCode = snapshot.data!.statusCode; if (statusCode == 200) { List lessons = LessonsListBuilder.buildList( - jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), count: count) + jsonDecode(utf8.decode(snapshot.data!.bodyBytes)), + count: count) .lessons; if (lessons.isNotEmpty) { return Column(children: lessons); } else { - var chars = Runes('Keine Stunden mehr gefunden. Sieht so aus als hättest du Schluss für heute \u{1F389}'); + var chars = Runes( + 'Keine Stunden mehr gefunden. Sieht so aus als hättest du Schluss für heute \u{1F389}'); List cardChildren = []; cardChildren.add(ListTile( title: Text(String.fromCharCodes(chars), - style: const TextStyle(color: Palette.primary)) - )); + style: const TextStyle(color: Palette.primary)))); Card card = Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), @@ -336,18 +364,16 @@ Widget buildTodayClassTimetableLesson(int count) { Future.delayed(Duration.zero, () { Navigator.push( context, - MaterialPageRoute( - builder: (context) => - Login()), + MaterialPageRoute(builder: (context) => Login()), ); }); } else if (statusCode == 500) { - var chars = Runes('Es konnte kein Vertretungsplan für heute gefunden werden. \u{1F937}'); + var chars = Runes( + 'Es konnte kein Vertretungsplan für heute gefunden werden. \u{1F937}'); List cardChildren = []; cardChildren.add(ListTile( title: Text(String.fromCharCodes(chars), - style: const TextStyle(color: Palette.primary)) - )); + style: const TextStyle(color: Palette.primary)))); Card card = Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), @@ -364,7 +390,9 @@ Widget buildTodayClassTimetableLesson(int count) { } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), ); } return Center(child: Text('Error $statusCode')); @@ -383,7 +411,9 @@ Future fetchClassesList() async { var uri = Uri.https("mein.cantorgymnasium.de", "/api/classes"); var headers = {"x-api-key": "$apiKey"}; print(uri); - final response = http.get(uri, headers: headers).onError((error, stackTrace) { return(http.Response("", 404)); } ); + final response = http.get(uri, headers: headers).onError((error, stackTrace) { + return (http.Response("", 404)); + }); return response; } @@ -405,12 +435,16 @@ Widget buildClassesChooser() { } else if (statusCode == 500) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Serverfehler. Bitte wende dich an den MeinCantor-Support.")), + child: Center( + child: Text( + "Serverfehler. Bitte wende dich an den MeinCantor-Support.")), ); } else if (statusCode == 404) { return const Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: Center(child: Text("Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), + child: Center( + child: Text( + "Keine Verbindung mit dem MeinCantor-Server möglich. Bitte prüfe deine Internetverbindung und deine DNS-Einstellungen oder wende dich an den MeinCantor-Support")), ); } return Text('$statusCode'); diff --git a/lib/color_presets.dart b/lib/presets/colors.dart similarity index 99% rename from lib/color_presets.dart rename to lib/presets/colors.dart index 31634e2..eaba1c2 100644 --- a/lib/color_presets.dart +++ b/lib/presets/colors.dart @@ -42,4 +42,4 @@ dynamic colors = { 'Frz': Colors.amberAccent[700], 'frz1': Colors.amberAccent[700], '---': Colors.white -}; \ No newline at end of file +}; diff --git a/lib/subject_presets.dart b/lib/presets/subjects.dart similarity index 96% rename from lib/subject_presets.dart rename to lib/presets/subjects.dart index fd197aa..0bd39d3 100644 --- a/lib/subject_presets.dart +++ b/lib/presets/subjects.dart @@ -1,4 +1,5 @@ -dynamic names = { +dynamic subjects = { + '---': '---', 'Bio': 'Biologie', 'Mat': 'Mathematik', 'matL1': 'Mathematik Leistungskurs 1', @@ -15,7 +16,6 @@ dynamic names = { 'frz2': 'Französisch 2', 'frz3': 'Französisch 3', 'Phy': 'Physik', - '---': '---', 'Spo': 'Sport', 'Deu': 'Deutsch', 'deu1': 'Deutsch 1', @@ -30,4 +30,4 @@ dynamic names = { 'FK': 'Fachkurs', 'JIA': 'Junior-Ingenieur-Akademie', 'WoU': 'Wahlobligatorischer Unterricht' -}; \ No newline at end of file +}; diff --git a/lib/teacher_presets.dart b/lib/presets/teachers.dart similarity index 99% rename from lib/teacher_presets.dart rename to lib/presets/teachers.dart index af340b7..e348319 100644 --- a/lib/teacher_presets.dart +++ b/lib/presets/teachers.dart @@ -52,4 +52,4 @@ dynamic teachers = { 'Henk': 'Frau Henke', 'Wolf': 'Herr Wolf', 'Gitt': 'Herr Gitter', -}; \ No newline at end of file +}; diff --git a/lib/raumuebersicht.dart b/lib/raumuebersicht.dart index 21ab6bd..2cf97d9 100644 --- a/lib/raumuebersicht.dart +++ b/lib/raumuebersicht.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class RoomOverview extends StatelessWidget { - const RoomOverview ({Key? key}) : super(key: key); + const RoomOverview({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/schuelerzeitung.dart b/lib/schuelerzeitung.dart index 22c04e5..e17a1ee 100644 --- a/lib/schuelerzeitung.dart +++ b/lib/schuelerzeitung.dart @@ -1,6 +1,12 @@ +import 'dart:convert'; + +import 'package:MeinCantor/networking.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; + class SZ extends StatelessWidget { const SZ({Key? key}) : super(key: key); @@ -11,45 +17,93 @@ class SZ extends StatelessWidget { title: const Text("Schülerzeitung"), centerTitle: true, ), - body: ListView( - children: [ - Card( - child: Column(children: [ - Padding( - padding: EdgeInsets.fromLTRB(10, 10, 10, 10), - child: ListTile( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => Article()), - ); - }, - title: const Text( - "Schülersprecherwahl 2021: Kandidatenduos im Interview", - style: TextStyle(fontWeight: FontWeight.bold)), - subtitle: const Text( - "17.09.2021, Halle(Saale) Drei Trios stellen sich dieses Jahr zur Wahl...")), - ) - ]), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), - ), - ) - ], - ) - /*const Center( - child: Text("Derzeit nichts hier..."), - )*/ - + body: FutureBuilder( + future: getArticles(), + builder: (context, snapshot) { + if (snapshot.hasData) { + int statusCode = snapshot.data!.statusCode; + if (statusCode == 200) { + String data = utf8.decode(snapshot.data!.bodyBytes); + List articles = jsonDecode(data); + List articleTiles = []; + for (var element in articles) { + Card card = Card( + child: Column(children: [ + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), + child: ListTile( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => Article.fromData(element["title"], element["content"], element["author"], element["published_at"]).widget), + ); + }, + title: Text(element["title"], + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text( + element["summary"])), + ) + ]), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + ); + articleTiles.add(card); + } + return ListView( + children: articleTiles.reversed.toList(), + ); + } else { + return(const Center( + child: Text("Uups... Irgendwas ist schief gelaufen") + )); + } + } else { + return(const Center( + child: CircularProgressIndicator() + )); + } + }, + ), ); } } -class Article extends StatelessWidget { - const Article({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { +class Article { + Widget widget; + //const Article({Key? key}) : super(key: key); + Article({required this.widget}); + factory Article.fromData(String title, String content, String author, String publishDate, ) { + return Article(widget: Scaffold( + appBar: AppBar( + title: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Text(title) + ), + ), + centerTitle: true, + ), + body: ListView( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 20), + children: [ + ListTile( + leading: Icon(MdiIcons.accountOutline), + title: Text(author), + ), + ListTile( + leading: Icon(MdiIcons.calendarOutline), + title: Text("${DateTime.parse(publishDate).day.toString()}.${DateTime.parse(publishDate).month.toString()}.${DateTime.parse(publishDate).year.toString()}"), + ), + Text(content) + ], + ) + ) + ); + } + //@override + /*Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text( @@ -70,5 +124,5 @@ class Article extends StatelessWidget { """) ], )); - } + }*/ } diff --git a/lib/schulbibliothek.dart b/lib/schulbibliothek.dart index 34fbd9f..81c4912 100644 --- a/lib/schulbibliothek.dart +++ b/lib/schulbibliothek.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class SB extends StatelessWidget { - const SB ({Key? key}) : super(key: key); + const SB({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/schulcomputer.dart b/lib/schulcomputer.dart index b5ac204..e5d7f97 100644 --- a/lib/schulcomputer.dart +++ b/lib/schulcomputer.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class SC extends StatelessWidget { - const SC ({Key? key}) : super(key: key); + const SC({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/timetable.dart b/lib/timetable.dart index 6d74b9f..bbfcc5e 100644 --- a/lib/timetable.dart +++ b/lib/timetable.dart @@ -1,56 +1,56 @@ -import 'package:MeinCantor/teacher_presets.dart'; +import 'package:MeinCantor/presets/teachers.dart'; +import 'package:MeinCantor/presets/subjects.dart'; +import 'package:MeinCantor/presets/colors.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'subject_presets.dart'; - -import 'color_presets.dart'; class ClassTimetableBuilder { final RefreshIndicator view; ClassTimetableBuilder({required this.view}); - factory ClassTimetableBuilder.buildView(Map json, BuildContext context) { + factory ClassTimetableBuilder.buildView( + Map json, BuildContext context) { List list = LessonsListBuilder.buildList(json).lessons; String info = TimetableInfo.fromJson(json).info; - if(info.isNotEmpty) { - list.insert(0, ListTile(title: Text("Informationen"), leading: Icon(MdiIcons.information), onTap: () { - showModalBottomSheet( - isScrollControlled: true, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25.0), - ), - context: context, - builder: (BuildContext context) { - return Container( - height: 400, - child: ListView( - //mainAxisAlignment: MainAxisAlignment.center, - //mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text("Informationen", style: TextStyle(fontWeight: FontWeight.bold)), - leading: Icon(Icons.arrow_back), - onTap: () { - Navigator.of(context).pop(); - }, - ), - Padding( - padding: const EdgeInsets.all(20), - child: Text(info), - ), - /*ElevatedButton( - child: const Text('Close BottomSheet'), - onPressed: () => Navigator.pop(context), - )*/ - ], - ), - ); - }, - ); - }, - ) - ); + if (info.isNotEmpty) { + list.insert( + 0, + ListTile( + title: const Text("Informationen"), + leading: const Icon(MdiIcons.information), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25.0), + ), + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 400, + child: ListView( + children: [ + ListTile( + title: const Text("Informationen", + style: TextStyle(fontWeight: FontWeight.bold)), + leading: const Icon(Icons.arrow_back), + onTap: () { + Navigator.of(context).pop(); + }, + ), + Padding( + padding: const EdgeInsets.all(20), + child: Text(info), + ), + ], + ), + ); + }, + ); + }, + )); } return ClassTimetableBuilder( view: RefreshIndicator( @@ -58,11 +58,10 @@ class ClassTimetableBuilder { return Future.delayed(const Duration(seconds: 1)); }, child: ListView( - //shrinkWrap: true, physics: const AlwaysScrollableScrollPhysics(), children: list, ), - ) + ) ); } } @@ -80,11 +79,11 @@ Future buildLessonColor(String lesson) async { class LessonsListBuilder { final List lessons; LessonsListBuilder({required this.lessons}); - factory LessonsListBuilder.buildList(Map json, {int count: 0}) { + factory LessonsListBuilder.buildList(Map json, + {int count = 0}) { List children = []; - ClassTimetable.fromJson(json).timetable.forEach((element) { + for (var element in ClassTimetable.fromJson(json).timetable) { List cardChildren = []; - print(element.count.toString() + " " + count.toString()); if (element.count.toString() == count.toString() || count == 0) { cardChildren.add(ListTile( title: Text(element.count.toString() + '.' + ' ' + element.name, @@ -123,7 +122,7 @@ class LessonsListBuilder { ); children.add(card); } - }); + } return LessonsListBuilder(lessons: children); } } @@ -140,55 +139,55 @@ class ClassTimetable { final List timetable; ClassTimetable({required this.timetable}); factory ClassTimetable.fromJson(Map json) { - print(json); List lessons = []; json['courses'].forEach((value) { - var name; - var teacher; - var room; + String subject; + String teacher; + String room; + String info; + Color fontColor; if (value['Fa'].runtimeType != String) { - name = value['Fa']['#text']; + subject = value['Fa']['#text']; } else { - name = value['Fa']; + subject = value['Fa']; } + if (value['Le'].runtimeType != String) { teacher = value['Le']['#text']; } else { teacher = value['Le']; } - print(value['Ra']); + if (value['Ra'].runtimeType != String && value['Ra'].runtimeType != int) { - if (value['Ra']['#text'] == ' ') { - room = ''; - } else if (value['Ra']['#text'] == null) { + if (value['Ra']['#text'] == ' ' || value['Ra']['#text'] == null) { room = ''; } else { - room = value['Ra']['#text']; + room = value['Ra']['#text'].toString(); } } else if (value['Ra'] == ' ') { room = ''; } else { - room = value['Ra']; + room = value['Ra'].toString(); } - Color fontColor; - if (name == '---') { + + if (subject == '---') { fontColor = Colors.red; } else { fontColor = Colors.white; } - var info; + if (value['If'].runtimeType != String) { info = ''; } else { info = value['If']; } - Future lessonColor = buildLessonColor(name); + Future lessonColor = buildLessonColor(subject); lessons.add(TimetableLesson( value['St'], - names[name] ?? name.toString(), + subjects[subject] ?? subject.toString(), teachers[teacher] ?? teacher.toString(), room.toString(), value['If'].toString(), diff --git a/pubspec.yaml b/pubspec.yaml index 3f5c16d..7c81600 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.7.5-beta1.nightly2021-11-04 +version: 0.7.5-beta1.nightly2021-11-16 environment: sdk: ">=2.12.0 <3.0.0" @@ -36,10 +36,10 @@ dependencies: http: ^0.13.3 google_fonts: ^2.1.0 time: ^2.0.0 - flutter_launcher_icons: "^0.9.1" + flutter_launcher_icons: ^0.9.1 fluttertoast: ^8.0.8 flutter_colorpicker: ^0.6.0 - material_design_icons_flutter: 5.0.5955-rc.1 + material_design_icons_flutter: ^5.0.5955-rc.1 cyclop: ^0.5.2 flutter_icons: