feat(edit): event editing — shared form, scoped recurring writes, recurrence picker (v1.3)
The create form (v1.2) now edits: a pencil on the detail screen (writable calendars only, contextual WRITE upgrade like delete) opens it prefilled via EventDetail.toEditForm; populated sections always show, the calendar is fixed, and a dirty-check writes only changed columns (pristine saves are no-ops). Saving a dirty recurring event parks in SaveUiState.AwaitingScope and asks how far the change reaches (Google model): "only this event" = modified-occurrence exception via CONTENT_EXCEPTION_URI (empty optionals as explicit NULLs since the provider clones the parent row), "this and all following" = series split (insert new event first, then truncate), "all events" = series-row update with the time delta applied to the series DTSTART. A changed rule drops the exception option. Delete gained the same middle scope. Recurrence: EventForm.rrule + SimpleRecurrence (FREQ/INTERVAL/UNTIL/COUNT + weekly BYDAY with locale-ordered weekday toggles) behind a picker on create and edit; unrepresentable rules render humanized (shared ui/common RecurrenceText) and survive verbatim. UNTIL validation flags rules ending before the event starts. Provider lessons baked in (verified on-device via adb probes): instance caches regenerate only from an update's own values, so truncation sends the full time-column set (truncateSeries) — RRULE-only updates left a stale duplicate occurrence on the split day; UNTIL is written as the local end of day in UTC (toRRule(zone), previousLocalDayEndUtcMillis) so UTC+x zones can't leak an extra day. Reminder edits reconcile against actual provider rows, keeping untouched rows' methods. Tests: RecurrenceTest (parse/render/round-trip, truncation), update/exception mapper paths, repository pass-throughs, prefill + populatedFields, raw-title mapper. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -45,12 +45,15 @@
|
||||
|
||||
<!-- Event-Detail-Screen (S4) -->
|
||||
<string name="event_detail_back">Zurück</string>
|
||||
<string name="event_detail_edit">Bearbeiten</string>
|
||||
<string name="event_detail_delete">Löschen</string>
|
||||
<string name="event_delete_title">Termin löschen?</string>
|
||||
<string name="event_delete_body">Der Termin wird aus deinem Kalender und von allen synchronisierten Geräten entfernt.</string>
|
||||
<string name="event_delete_recurring_title">Wiederkehrenden Termin löschen</string>
|
||||
<string name="event_delete_option_occurrence">Nur dieser Termin</string>
|
||||
<string name="event_delete_option_following">Dieser und alle folgenden Termine</string>
|
||||
<string name="event_delete_option_series">Alle Termine der Serie</string>
|
||||
<string name="event_edit_recurring_title">Wiederkehrenden Termin bearbeiten</string>
|
||||
<string name="event_delete_failed">Termin konnte nicht gelöscht werden</string>
|
||||
<string name="event_delete_write_denied">Calendula braucht Schreibzugriff, um Termine zu löschen</string>
|
||||
<string name="dialog_cancel">Abbrechen</string>
|
||||
@@ -78,6 +81,21 @@
|
||||
<string name="reminder_unit_weeks">Wochen</string>
|
||||
<string name="event_edit_availability">Verfügbarkeit</string>
|
||||
<string name="event_edit_visibility">Sichtbarkeit</string>
|
||||
|
||||
<!-- Termin-Formular — Wiederholungs-Picker (v1.3) -->
|
||||
<string name="event_edit_recurrence_none">Wiederholt sich nicht</string>
|
||||
<string name="event_edit_recurrence_custom">Benutzerdefiniert</string>
|
||||
<string name="event_edit_recurrence_every">Alle</string>
|
||||
<string name="recurrence_unit_days">Tage</string>
|
||||
<string name="recurrence_unit_weeks">Wochen</string>
|
||||
<string name="recurrence_unit_months">Monate</string>
|
||||
<string name="recurrence_unit_years">Jahre</string>
|
||||
<string name="event_edit_recurrence_ends">Endet</string>
|
||||
<string name="event_edit_recurrence_end_never">Nie</string>
|
||||
<string name="event_edit_recurrence_end_until">An einem Datum</string>
|
||||
<string name="event_edit_recurrence_end_count">Nach einer Anzahl</string>
|
||||
<string name="event_edit_recurrence_times">Mal</string>
|
||||
<string name="event_edit_error_recurrence_ends_before_start">Wiederholung endet vor dem Beginn</string>
|
||||
<string name="event_availability_busy">Beschäftigt</string>
|
||||
<string name="event_access_default">Standard</string>
|
||||
<string name="event_access_public">Öffentlich</string>
|
||||
|
||||
Reference in New Issue
Block a user