import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:jiffy/jiffy.dart'; import 'package:marianum_mobile/api/webuntis/queries/getHolidays/getHolidaysResponse.dart'; import 'package:timetable_view/timetable_view.dart'; import '../../../api/webuntis/queries/getHolidays/getHolidays.dart'; import '../../../api/webuntis/queries/getRooms/getRoomsResponse.dart'; import '../../../api/webuntis/queries/getSubjects/getSubjectsResponse.dart'; import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; import '../../../data/timetable/timetableProps.dart'; class DayListView extends StatefulWidget { final TimetableProps value; const DayListView(this.value, {Key? key}) : super(key: key); @override State createState() => _DayListViewState(); } class _DayListViewState extends State { @override Widget build(BuildContext context) { return TimetableView( laneEventsList: _buildLaneEvents(widget.value), onEventTap: (TableEvent event) {}, timetableStyle: CustomTableStyle(context), onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {}, ); } List _buildLaneEvents(TimetableProps data) { List laneEvents = List.empty(growable: true); Jiffy.locale("de"); // todo move outwards GetTimetableResponse timetable = data.getTimetableResponse; GetRoomsResponse rooms = data.getRoomsResponse; GetSubjectsResponse subjects = data.getSubjectsResponse; GetHolidaysResponse holidays = data.getHolidaysResponse; GetHolidaysResponseObject? holidayInfo = GetHolidays.find(holidays, time: data.queryDate); if(holidayInfo != null) { laneEvents.add( LaneEvents( lane: Lane( laneIndex: data.queryDate.millisecondsSinceEpoch, name: "${Jiffy(data.queryDate.toString()).format("dd.MM.yy")}\n${Jiffy(data.queryDate.toString()).format("EEEE")}", textStyle: TextStyle( color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold, fontSize: 14 ) ), events: List.of([ TableEvent( title: holidayInfo.name, eventId: holidayInfo.id, laneIndex: data.queryDate.millisecondsSinceEpoch, startTime: parseTime(0800), endTime: parseTime(1500), padding: const EdgeInsets.all(5), backgroundColor: Theme.of(context).disabledColor, location: "\n${holidayInfo.longName}", ) ]), ) ); } List dayList = timetable.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( timetable.result.where((element) => element.date == day).length, (index) { GetTimetableResponseObject tableEvent = timetable.result.where((element) => element.date == day).elementAt(index); GetSubjectsResponseObject subject = subjects.result.firstWhere((subject) => subject.id == tableEvent.su[0]['id']); return TableEvent( title: "${subject.alternateName} (${subject.longName})", 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${rooms.result.firstWhere((room) => room.id == tableEvent.ro[0]['id']).name} - ${tableEvent.te[0]['longname']} (${tableEvent.te[0]['name']})", ); } ) ) ); }); 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; }