initial
This commit is contained in:
182
lib/todo/calendar.dart
Normal file
182
lib/todo/calendar.dart
Normal file
@@ -0,0 +1,182 @@
|
||||
import 'dart:core';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hiddingsel_app/constants/constant.dart';
|
||||
import 'package:hiddingsel_app/packages/list_view_extension/colum_extension.dart';
|
||||
import 'package:table_calendar/table_calendar.dart';
|
||||
import '../constants/enums.dart';
|
||||
import '../appflow/controller/events.dart';
|
||||
import '../appflow/model/event.dart';
|
||||
import '../appflow/view/navigation_drawer.dart';
|
||||
import 'calendar_list.dart';
|
||||
|
||||
class CalendarListPage extends StatefulWidget with NavigationDrawerItem {
|
||||
|
||||
final String title = 'Termine';
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => CalendarListPageState();
|
||||
}
|
||||
|
||||
class CalendarListPageState extends State<CalendarListPage> {
|
||||
List _selectedDayList = [];
|
||||
Map<DateTime, List<EventModel>> _events = {};
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
init();
|
||||
}
|
||||
|
||||
void init() async {
|
||||
EventController.getEventListStream().forEach((events) {
|
||||
setState(() {
|
||||
_events = _mapListToCalendarEvents(events);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => SafeArea(
|
||||
bottom: false,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(UIShapes.paddingSimple,
|
||||
UIShapes.paddingSimple, UIShapes.paddingSimple, 0),
|
||||
child: ListView(
|
||||
primary: true,
|
||||
children: <Widget>[
|
||||
FormattedCalendar(_events, _onDaySelected),
|
||||
ColumnExtension.builder(
|
||||
itemCount: _selectedDayList.length,
|
||||
itemBuilder: (context, index) =>
|
||||
CalendarListTile(_selectedDayList[index]),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
void _onDaySelected(DateTime dateTime) {
|
||||
setState(() {
|
||||
_selectedDayList = _events[DateTime(dateTime.year, dateTime.month, dateTime.day)] ?? [];
|
||||
});
|
||||
}
|
||||
|
||||
Map<DateTime, List<EventModel>> _mapListToCalendarEvents(List<EventModel> list) {
|
||||
final map = <DateTime, List<EventModel>>{};
|
||||
DateTime dateKey;
|
||||
int i;
|
||||
int j;
|
||||
for (final e in list) {
|
||||
j = 0;
|
||||
dateKey = e.schedule.startTime;
|
||||
do {
|
||||
if (e.schedule.frequency != Frequency.once && e.schedule.interval != null) {
|
||||
if (e.schedule.frequency == Frequency.days) {
|
||||
dateKey = dateKey.add(Duration(days: e.schedule.interval!));
|
||||
} else if (e.schedule.frequency == Frequency.weeks) {
|
||||
dateKey = dateKey.add(Duration(days: 7 * e.schedule.interval!));
|
||||
} else if (e.schedule.frequency == Frequency.months) {
|
||||
dateKey = dateKey =
|
||||
DateTime(dateKey.year, dateKey.month + e.schedule.interval!, dateKey.day);
|
||||
}
|
||||
if (e.schedule.until != null && e.schedule.until!.isBefore(dateKey)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
do {
|
||||
var dateKey2 = dateKey.add(Duration(days: i));
|
||||
dateKey2 = DateTime(dateKey2.year, dateKey2.month, dateKey2.day);
|
||||
if (map.containsKey(dateKey2)) {
|
||||
map[dateKey2]!.add(e);
|
||||
} else {
|
||||
map[dateKey2] = [e];
|
||||
}
|
||||
i++;
|
||||
} while (i < e.schedule.endTime.difference(e.schedule.startTime).inDays);
|
||||
j++;
|
||||
} while (e.schedule.frequency != Frequency.once && e.schedule.interval != null && j < 52);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
class FormattedCalendar extends StatefulWidget {
|
||||
final Map<DateTime, List<EventModel>> _events;
|
||||
final void Function(DateTime) _onDaySelected;
|
||||
|
||||
FormattedCalendar(this._events, this._onDaySelected);
|
||||
|
||||
@override
|
||||
_FormattedCalendarState createState() => _FormattedCalendarState();
|
||||
}
|
||||
|
||||
class _FormattedCalendarState extends State<FormattedCalendar> {
|
||||
|
||||
DateTime _focusedDay = DateTime.now();
|
||||
DateTime? _selectedDay;
|
||||
|
||||
_FormattedCalendarState();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var firstDay = DateTime.utc(2010, 10, 16);
|
||||
var lastDay = DateTime.utc(2030, 3, 14);
|
||||
final calendar = TableCalendar(
|
||||
locale: 'de_DE',
|
||||
availableCalendarFormats: const {
|
||||
CalendarFormat.month: 'Month',
|
||||
},
|
||||
headerStyle: HeaderStyle(
|
||||
titleCentered: true,
|
||||
titleTextStyle: UITheme.theme.textTheme.headlineSmall!,
|
||||
),
|
||||
firstDay: firstDay,
|
||||
lastDay: lastDay,
|
||||
focusedDay: _focusedDay,
|
||||
startingDayOfWeek: StartingDayOfWeek.monday,
|
||||
calendarStyle: CalendarStyle(
|
||||
weekendTextStyle: UITheme.theme.textTheme.bodyLarge!,
|
||||
defaultTextStyle: UITheme.theme.textTheme.bodyLarge!,
|
||||
todayTextStyle: UITheme.theme.textTheme.bodyMedium!,
|
||||
selectedTextStyle: UITheme.theme.textTheme.bodyMedium!,
|
||||
selectedDecoration: BoxDecoration(
|
||||
color: UIColors.grey5,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
todayDecoration: BoxDecoration(
|
||||
color: UIColors.grey4,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
markerDecoration: BoxDecoration(
|
||||
color: UIColors.yellow,
|
||||
shape: BoxShape.circle,
|
||||
)
|
||||
),
|
||||
eventLoader: (day) {
|
||||
return _getEventsForDay(day);
|
||||
},
|
||||
selectedDayPredicate: (day) {
|
||||
return isSameDay(_selectedDay, day);
|
||||
},
|
||||
onDaySelected: (selectedDay, focusedDay) {
|
||||
setState(() {
|
||||
_selectedDay = selectedDay;
|
||||
_focusedDay = focusedDay;
|
||||
widget._onDaySelected(selectedDay);
|
||||
});
|
||||
},
|
||||
);
|
||||
return calendar;
|
||||
}
|
||||
|
||||
List<EventModel> _getEventsForDay(DateTime day) {
|
||||
return widget._events[DateTime(day.year, day.month, day.day)] ?? [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user