feat: add recurring event deletion with three modes

Implement three deletion modes for recurring events:
- single: exclude specific occurrence via EXDATE mechanism
- future: set RRULE UNTIL to stop future occurrences
- all: delete entire event series

Changes include:
- Add exceptionDates field to CalendarEvent model
- Add RecurringDeleteMode type and DeleteRecurringEventDTO
- EventService.deleteRecurring() with mode-based logic using rrule library
- EventController DELETE endpoint accepts mode/occurrenceDate query params
- recurrenceExpander filters out exception dates during expansion
- AI tools support deleteMode and occurrenceDate for proposed deletions
- ChatService.confirmEvent() handles recurring delete modes
- New DeleteEventModal component for unified delete confirmation UI
- Calendar screen integrates modal for both recurring and non-recurring events
This commit is contained in:
2026-01-25 15:19:31 +01:00
parent a42e2a7c1c
commit 2b999d9b0f
35 changed files with 787 additions and 200 deletions

View File

@@ -75,11 +75,19 @@ export const EventCardBase = ({
borderBottomColor: theme.borderPrimary,
}}
>
<Text className="font-bold text-base" style={{ color: theme.textPrimary }}>{title}</Text>
<Text
className="font-bold text-base"
style={{ color: theme.textPrimary }}
>
{title}
</Text>
</View>
{/* Content */}
<View className="px-3 py-2" style={{ backgroundColor: theme.secondaryBg }}>
<View
className="px-3 py-2"
style={{ backgroundColor: theme.secondaryBg }}
>
{/* Date */}
<View className="flex-row items-center mb-1">
<Feather
@@ -116,18 +124,13 @@ export const EventCardBase = ({
color={theme.textPrimary}
style={{ marginRight: 8 }}
/>
<Text style={{ color: theme.textPrimary }}>
Wiederkehrend
</Text>
<Text style={{ color: theme.textPrimary }}>Wiederkehrend</Text>
</View>
)}
{/* Description */}
{description && (
<Text
style={{ color: theme.textPrimary }}
className="text-sm mt-1"
>
<Text style={{ color: theme.textPrimary }} className="text-sm mt-1">
{description}
</Text>
)}