Added rrule generator for custom events

This commit is contained in:
Elias Müller 2024-02-09 18:46:05 +01:00
parent 64b23c88ae
commit 3eae5ba10a
3 changed files with 86 additions and 71 deletions

View File

@ -1,4 +1,9 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import 'package:rrule_generator/rrule_generator.dart';
class AddCustomTimetableEventDialog extends StatefulWidget { class AddCustomTimetableEventDialog extends StatefulWidget {
const AddCustomTimetableEventDialog({super.key}); const AddCustomTimetableEventDialog({super.key});
@ -8,98 +13,108 @@ class AddCustomTimetableEventDialog extends StatefulWidget {
} }
class _AddCustomTimetableEventDialogState extends State<AddCustomTimetableEventDialog> { class _AddCustomTimetableEventDialogState extends State<AddCustomTimetableEventDialog> {
DateTime _selectedDate = DateTime.now(); DateTime _date = DateTime.now();
TimeOfDay _selectedStartTime = TimeOfDay.now(); TimeOfDay _starTime = TimeOfDay.now().replacing(minute: 00);
TimeOfDay _selectedEndTime = TimeOfDay.now(); TimeOfDay _endTime = TimeOfDay.now().replacing(minute: 30);
final TextEditingController _eventNameController = TextEditingController(); final TextEditingController _eventName = TextEditingController();
bool _isRecurring = false; final TextEditingController _eventDescription = TextEditingController();
String _recurringFrequency = 'Wöchentlich'; String _recurringRule = "";
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AlertDialog( return AlertDialog(
insetPadding: const EdgeInsets.all(20),
contentPadding: const EdgeInsets.all(10),
title: const Text('Termin hinzufügen'), title: const Text('Termin hinzufügen'),
content: SingleChildScrollView( content: SingleChildScrollView(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
ListTile( ListTile(
title: const Text('Startdatum:'), title: TextField(
subtitle: Text('${_selectedDate.day}/${_selectedDate.month}/${_selectedDate.year}'), controller: _eventName,
autofocus: true,
decoration: const InputDecoration(
labelText: "Terminname",
border: OutlineInputBorder()
),
),
),
ListTile(
title: TextField(
controller: _eventDescription,
maxLines: 2,
minLines: 2,
decoration: const InputDecoration(
labelText: "Beschreibung",
border: OutlineInputBorder()
),
),
),
const Divider(),
ListTile(
title: Text(Jiffy.parseFromDateTime(_date).yMMMd),
subtitle: const Text("Datum"),
onTap: () async { onTap: () async {
final DateTime? pickedDate = await showDatePicker( final DateTime? pickedDate = await showDatePicker(
context: context, context: context,
initialDate: _selectedDate, initialDate: _date,
firstDate: DateTime.now(), firstDate: DateTime.now(),
lastDate: DateTime(2101), lastDate: DateTime(2101),
); );
if (pickedDate != null && pickedDate != _selectedDate) { if (pickedDate != null && pickedDate != _date) {
setState(() { setState(() {
_selectedDate = pickedDate; _date = pickedDate;
}); });
} }
}, },
), ),
ListTile( ListTile(
title: const Text('Startzeit:'), title: Text(_starTime.format(context).toString()),
subtitle: Text('${_selectedStartTime.hour}:${_selectedStartTime.minute}'), subtitle: const Text("Beginnend"),
onTap: () async { onTap: () async {
final TimeOfDay? pickedTime = await showTimePicker( final TimeOfDay? pickedTime = await showTimePicker(
context: context, context: context,
initialTime: _selectedStartTime, initialTime: _starTime,
); );
if (pickedTime != null && pickedTime != _selectedStartTime) { if(pickedTime == null) return;
setState(() { setState(() {
_selectedStartTime = pickedTime; _starTime = pickedTime;
}); });
}
}, },
), ),
ListTile( ListTile(
title: const Text('Endzeit:'), title: Text(_endTime.format(context).toString()),
subtitle: Text('${_selectedEndTime.hour}:${_selectedEndTime.minute}'), subtitle: const Text("Endend"),
onTap: () async { onTap: () async {
final TimeOfDay? pickedTime = await showTimePicker( final TimeOfDay? pickedTime = await showTimePicker(
context: context, context: context,
initialTime: _selectedEndTime, initialTime: _endTime,
); );
if (pickedTime != null && pickedTime != _selectedEndTime) { if (pickedTime != null && pickedTime != _endTime) {
setState(() { setState(() {
_selectedEndTime = pickedTime; _endTime = pickedTime;
}); });
} }
}, },
), ),
TextField( const Divider(),
controller: _eventNameController, RRuleGenerator(
decoration: const InputDecoration(labelText: 'Terminname'), config: RRuleGeneratorConfig(
headerEnabled: true,
weekdayBackgroundColor: Theme.of(context).colorScheme.secondary,
weekdaySelectedBackgroundColor: Theme.of(context).primaryColor,
weekdayColor: Colors.black,
), ),
CheckboxListTile( initialRRule: _recurringRule,
title: const Text('Wiederholend'), textDelegate: const GermanRRuleTextDelegate(),
value: _isRecurring, onChange: (String newValue) {
onChanged: (bool? value) { log("Rule: $newValue");
setState(() { setState(() {
_isRecurring = value!; _recurringRule = newValue;
}); });
}, },
), )
if (_isRecurring) ...[
DropdownButtonFormField<String>(
value: _recurringFrequency,
items: ['Wöchentlich', 'Täglich', 'Monatlich'].map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (String? value) {
setState(() {
_recurringFrequency = value ?? "";
});
},
),
// Hier könntest du weitere Felder für die Wiederholungseigenschaften hinzufügen
],
], ],
), ),
), ),
@ -113,22 +128,17 @@ class _AddCustomTimetableEventDialogState extends State<AddCustomTimetableEventD
TextButton( TextButton(
onPressed: () { onPressed: () {
// Hier kannst du die Eingaben verwenden // Hier kannst du die Eingaben verwenden
String startDate = '${_selectedDate.day}/${_selectedDate.month}/${_selectedDate.year}'; String startDate = '${_date.day}/${_date.month}/${_date.year}';
String startTime = '${_selectedStartTime.hour}:${_selectedStartTime.minute}'; String startTime = '${_starTime.hour}:${_starTime.minute}';
String endTime = '${_selectedEndTime.hour}:${_selectedEndTime.minute}'; String endTime = '${_endTime.hour}:${_endTime.minute}';
String eventName = _eventNameController.text; String eventName = _eventName.text;
bool isRecurring = _isRecurring; String recurringFrequency = _recurringRule;
String recurringFrequency = _recurringFrequency;
// Hier kannst du die Daten speichern oder weiterverarbeiten // Hier kannst du die Daten speichern oder weiterverarbeiten
print('Startdatum: $startDate'); print('Startdatum: $startDate');
print('Startzeit: $startTime'); print('Startzeit: $startTime');
print('Endzeit: $endTime'); print('Endzeit: $endTime');
print('Terminname: $eventName'); print('Terminname: $eventName');
print('Wiederholend: $isRecurring');
if (_isRecurring) {
print('Wiederholungs-Frequenz: $recurringFrequency');
}
// Hier könntest du die Termindaten weiterverarbeiten, z.B. speichern und den Dialog schließen // Hier könntest du die Termindaten weiterverarbeiten, z.B. speichern und den Dialog schließen
Navigator.of(context).pop(); Navigator.of(context).pop();

View File

@ -66,9 +66,13 @@ class _TimetableState extends State<Timetable> {
} }
), ),
IconButton( IconButton(
icon: const Icon(Icons.add_card_outlined), icon: const Icon(Icons.add_outlined),
onPressed: () { onPressed: () {
showDialog(context: context, builder: (context) => const AddCustomTimetableEventDialog()); showDialog(
context: context,
builder: (context) => const AddCustomTimetableEventDialog(),
barrierDismissible: false,
);
}, },
), ),
], ],

View File

@ -93,6 +93,7 @@ dependencies:
flutter_app_badger: ^1.5.0 flutter_app_badger: ^1.5.0
qr_flutter: ^4.1.0 qr_flutter: ^4.1.0
easy_debounce: ^2.0.3 easy_debounce: ^2.0.3
rrule_generator: ^0.5.6
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: