import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRooms.dart'; import 'package:marianum_mobile/data/timetable/timetableProps.dart'; import 'package:marianum_mobile/widget/loadingSpinner.dart'; import 'package:marianum_mobile/widget/offlineError.dart'; import 'package:timetable_view/timetable_view.dart'; import '../../../api/webuntis/queries/getTimetable/getTimetableParams.dart'; import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; import '../../../api/webuntis/queries/getTimetable/getTimetable.dart'; class TestTimeTable extends StatefulWidget { const TestTimeTable({Key? key}) : super(key: key); @override State createState() => _TestTimeTableState(); } class _TestTimeTableState extends State { late Future data; @override void initState() { data = GetTimetable( GetTimetableParams( options: GetTimetableParamsOptions( element: GetTimetableParamsOptionsElement( id: 92, type: 5, keyType: GetTimetableParamsOptionsElementKeyType.id, ), startDate: 20230206, endDate: 20230212, ) ) ).run(); GetRooms().run().then((value) => { log(value.rawResponse.body) }); super.initState(); } @override Widget build(BuildContext context) { return FutureBuilder( builder: (BuildContext context, AsyncSnapshot snapshot) { if(snapshot.hasData) { return Center( child: TimetableView( laneEventsList: _buildLaneEvents(snapshot.data!), onEventTap: (TableEvent event) {}, timetableStyle: CustomTableStyle(context), onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {}, ), ); } else if(snapshot.hasError) { return const OfflineBanner(text: "Der Stundenplan konnte nicht geladen werden!"); } else { return const Center( child: CircularProgressIndicator(), ); } }, future: data, ); } List _buildLaneEvents(GetTimetableResponse data) { List laneEvents = List.empty(growable: true); Jiffy.locale("de"); List dayList = data.result.map((e) => e.date).toSet().toList(); dayList.sort((a, b) => a-b); dayList.forEach((day) { //Every Day laneEvents.add( LaneEvents( lane: Lane( laneIndex: day, name: "${Jiffy(day.toString()).format("dd.MM.yy")}\n${Jiffy(day.toString()).format("EEEE")}", textStyle: TextStyle( color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold, fontSize: 14 ) ), events: List.generate( data.result.where((element) => element.date == day).length, (index) { GetTimetableResponseObject tableEvent = data.result.where((element) => element.date == day).elementAt(index); return TableEvent( title: "${tableEvent.substText}", eventId: tableEvent.id, laneIndex: day, startTime: parseTime(tableEvent.startTime), endTime: parseTime(tableEvent.endTime), padding: const EdgeInsets.all(5), backgroundColor: Theme.of(context).primaryColor, location: "\n${tableEvent.statflags}", ); } ) ) ); }); return laneEvents; } TableEventTime parseTime(int input) { String time = input.toString().length < 4 ? "0$input" : input.toString(); return TableEventTime(hour: int.parse(time.substring(0, 2)), minute: int.parse(time.substring(2, 4))); } } class CustomTableStyle extends TimetableStyle { dynamic context; CustomTableStyle(this.context); @override int get startHour => 07; @override int get endHour => 17; @override Color get cornerColor => Theme.of(context).primaryColor; @override Color get timeItemTextColor => Theme.of(context).primaryColor; @override double get timeItemHeight => 70; @override double get timeItemWidth => 50; @override double get laneWidth => MediaQuery.of(context).size.width - timeItemWidth; }