Files
Client/lib/view/pages/timetable/details/custom_event_sheet.dart
T
2026-05-08 20:12:40 +02:00

101 lines
3.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:rrule/rrule.dart';
import '../../../../api/mhsl/custom_timetable_event/custom_timetable_event.dart';
import '../../../../extensions/date_time.dart';
import '../../../../widget/centered_leading.dart';
import '../../../../widget/debug/debug_tile.dart';
import '../../../../widget/details_bottom_sheet.dart';
import '../custom_events/custom_event_edit_dialog.dart';
import 'delete_custom_event.dart';
class CustomEventSheet {
static void show(BuildContext context, CustomTimetableEvent event) {
final timeRange = event.startDate.timeRangeTo(event.endDate);
showDetailsBottomSheet(
context,
header: ListTile(
leading: const Icon(Icons.event_outlined, size: 32),
title: Text(
event.title,
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(timeRange),
),
children: (sheetCtx) => [
Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Center(
child: Wrap(
children: [
TextButton.icon(
onPressed: () {
Navigator.of(sheetCtx).pop();
showDialog(
context: context,
builder: (_) =>
CustomEventEditDialog(existingEvent: event),
);
},
label: const Text('Bearbeiten'),
icon: const Icon(Icons.edit_outlined),
),
TextButton.icon(
onPressed: () {
showDeleteCustomEventDialog(context, event).future.then((
_,
) {
if (!sheetCtx.mounted) return;
Navigator.of(sheetCtx).pop();
});
},
label: const Text('Löschen'),
icon: const Icon(Icons.delete_outline),
),
],
),
),
),
const Divider(height: 1),
ListTile(
leading: const Icon(Icons.info_outline),
title: Text(
event.description.isEmpty
? 'Keine Beschreibung'
: event.description,
),
),
ListTile(
leading: const CenteredLeading(Icon(Icons.repeat_outlined)),
title: Text(
'Serie: ${event.rrule.isNotEmpty ? "Wiederholend" : "Einmalig"}',
),
subtitle: FutureBuilder(
future: RruleL10nEn.create(),
builder: (_, snapshot) {
if (event.rrule.isEmpty) {
return const Text('Keine weiteren Vorkommnisse');
}
if (snapshot.data == null) return const Text('...');
final rrule = RecurrenceRule.fromString(event.rrule);
if (!rrule.canFullyConvertToText) {
return const Text('Keine genauere Angabe möglich.');
}
return Text(rrule.toText(l10n: snapshot.data!));
},
),
),
DebugTile(sheetCtx).child(
ListTile(
leading: const CenteredLeading(Icon(Icons.rule)),
title: const Text('RRule'),
subtitle: Text(event.rrule.isEmpty ? 'Keine' : event.rrule),
),
),
DebugTile(sheetCtx).jsonData(event.toJson()),
],
);
}
}