refactored broad range of the application, split files, modularized calendar and file views, centralized bottom sheets and clipboard handling, and implemented unit test coverage

This commit is contained in:
2026-05-08 19:05:16 +02:00
parent 3b1b0d0c19
commit c62a14645a
68 changed files with 4633 additions and 3141 deletions
@@ -0,0 +1,38 @@
import '../../../../extensions/date_time.dart';
import '../../../../state/app/modules/marianum_dates/bloc/marianum_dates_state.dart';
/// Pure formatting helpers for `MarianumDate` events. Held outside the view
/// so the view can stay focused on layout and these helpers remain
/// unit-testable.
class EventFormatter {
/// Compact trailing label shown in the list row: "HH:mmHH:mm" for same-day,
/// "dd.MM. HH:mmdd.MM. HH:mm" otherwise, or "Ganztägig" for all-day events.
static String trailingLabel(MarianumDate event) {
if (event.isAllDay) return 'Ganztägig';
if (event.start.isSameDay(event.end)) {
if (event.start == event.end) return event.start.formatHm();
return '${event.start.formatHm()}${event.end.formatHm()}';
}
return '${event.start.formatDateShortHm()}${event.end.formatDateShortHm()}';
}
/// Verbose date+time line shown in the details sheet. Drops the trailing
/// time when the event is all-day, and de-duplicates same-day endpoints.
static String longRange(MarianumDate event) {
if (event.isAllDay) {
final inclusiveEnd = event.end.isAfter(event.start)
? event.end.subtract(const Duration(days: 1))
: event.end;
return event.start.isSameDay(inclusiveEnd)
? '${event.start.formatDate()} · Ganztägig'
: '${event.start.formatDate()} ${inclusiveEnd.formatDate()} · Ganztägig';
}
if (event.start.isSameDay(event.end)) {
if (event.start == event.end) {
return '${event.start.formatDate()} · ${event.start.formatHm()}';
}
return '${event.start.formatDate()} · ${event.start.formatHm()} ${event.end.formatHm()}';
}
return '${event.start.formatDateTime()} ${event.end.formatDateTime()}';
}
}