feat(calendars): name the contact-filled calendars, and hold their delete (#76)
All checks were successful
Translations / check (pull_request) Successful in 5s
CI / ci (pull_request) Successful in 6m11s

The special-dates mirrors were the last unexplained exclusion: writable,
visible, syncing, and still not offered as an event target, because their
events belong to the contact sync and anything authored there is removed on
the next pass. Their rows now say "Filled from your contacts", and the
pickers' footer names that third reason alongside switched-off and
read-only.

Their delete stays where it is rather than disappearing, but is held while
special dates are on: reconcileCalendars recreates a missing mirror for an
enabled type on the very next sync, so the delete would look like it worked
and then quietly undo itself. The button dims, an info card in the editor
says why and points at Settings → Special dates, and turning the feature off
gives the delete back — at which point a leftover mirror really is the
user's to remove.

The lock is derived from the enabled types' stored calendar ids, which is
what the sync itself reconciles against: a mirror whose type is switched off
is already an orphan the next sync would delete anyway, so it stays
deletable by hand.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-26 18:07:55 +02:00
parent 810da40b46
commit 6ccc9f9131
6 changed files with 82 additions and 3 deletions

View File

@@ -16,6 +16,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
the device, so the switch they used to have could not have shown you anything
— the calendar simply looked broken. Whether an account syncs a calendar stays
that account's own app's decision ([#78]).
- The birthday and anniversary calendars Calendula fills from your contacts are
marked **Filled from your contacts**, which is why they can't be picked for a
new event: anything you put there would be removed again on the next sync.
Deleting one is held back while special dates are switched on — Calendula
would simply create it again — and the calendar's editor says so; turn the
feature off under Settings → Special dates and the delete works as usual
([#76]).
- The calendar picker in the event form and in the .ics import screen now ends
with a **"Missing a calendar?"** row that opens Settings → Calendars, where
those marks then explain why a calendar isn't offered ([#76]).