feat(calendars): in-app enable/disable for calendars #38

Merged
makiolaj merged 5 commits from feat/disable-calendar into release/v2.10.0 2026-06-25 12:28:32 +00:00
Owner

Adds a second, heavier visibility level above the per-view hide filter. A disabled calendar is removed from the app's surfaces entirely — its events drop out of all views and search, and it disappears from the drawer filter list, the event-form calendar picker and the import target picker. It stays listed only in Settings → Calendars (dimmed, with a per-row switch) so it can always be brought back. Purely app-local (DataStore), reversible, and never touches the system VISIBLE/SYNC_EVENTS flags.

Changes

  • CalendarPrefs: disabledCalendarIds set + setter, mirroring the hidden set.
  • CalendarRepositoryImpl: instances()/searchEvents() exclude calendarId in (hidden union disabled); distinctUntilChanged() collapses the transient duplicate both DataStore-derived sets emit when either is toggled.
  • FilterViewModel: drop disabled calendars from the drawer filter list.
  • EventEditViewModel: exclude disabled from writableCalendars; last-used preselect on a now-disabled calendar falls back to the first remaining writable one.
  • ImportViewModel: exclude disabled from the import target list.
  • CalendarsScreen/ViewModel: per-row enable/disable Switch on both groups; disabled rows render dimmed (new GroupedRow dimmed flag).

Tests

  • CalendarPrefsTest: disabled-set round-trip, clearing, independence from hidden.
  • CalendarRepositoryImplTest: disabled events dropped, hidden+disabled union applied, re-emit on disabled-set change.

Verified on-device (Pixel 10). Branched changelog under [2.10.0].

🤖 Generated with Claude Code

Adds a second, heavier visibility level above the per-view hide filter. A disabled calendar is removed from the app's surfaces entirely — its events drop out of all views and search, and it disappears from the drawer filter list, the event-form calendar picker and the import target picker. It stays listed only in Settings → Calendars (dimmed, with a per-row switch) so it can always be brought back. Purely app-local (DataStore), reversible, and never touches the system VISIBLE/SYNC_EVENTS flags. ## Changes - CalendarPrefs: disabledCalendarIds set + setter, mirroring the hidden set. - CalendarRepositoryImpl: instances()/searchEvents() exclude calendarId in (hidden union disabled); distinctUntilChanged() collapses the transient duplicate both DataStore-derived sets emit when either is toggled. - FilterViewModel: drop disabled calendars from the drawer filter list. - EventEditViewModel: exclude disabled from writableCalendars; last-used preselect on a now-disabled calendar falls back to the first remaining writable one. - ImportViewModel: exclude disabled from the import target list. - CalendarsScreen/ViewModel: per-row enable/disable Switch on both groups; disabled rows render dimmed (new GroupedRow dimmed flag). ## Tests - CalendarPrefsTest: disabled-set round-trip, clearing, independence from hidden. - CalendarRepositoryImplTest: disabled events dropped, hidden+disabled union applied, re-emit on disabled-set change. Verified on-device (Pixel 10). Branched changelog under [2.10.0]. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
makiolaj added 4 commits 2026-06-25 12:08:33 +00:00
Update roadmap to reflect v2.8.0 releases (attendee editing, full-text
search, QS tile, now-line, contact pickers) and the week-numbers-in-month
rejection; capture the in-app 'disable a calendar' feature plan.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Introduce a second, heavier visibility level above the per-view hide
filter. A disabled calendar is removed from the app's surfaces entirely —
its events drop out of all views and search, and it disappears from the
drawer filter list, the event-form calendar picker and the import target
picker. It stays listed only in Settings → Calendars, where a per-row
switch toggles it, so it can always be brought back.

- CalendarPrefs: disabledCalendarIds set + setter, mirroring the hidden
  set (DataStore comma-separated string); never touches the system
  VISIBLE/SYNC_EVENTS flags, so it's app-local and reversible.
- CalendarRepositoryImpl: instances()/searchEvents() exclude
  calendarId ∈ (hidden ∪ disabled). distinctUntilChanged() on instances
  collapses the transient duplicate emission both DataStore-derived sets
  produce when either is toggled.
- FilterViewModel: drop disabled calendars from the drawer filter list.
- EventEditViewModel: exclude disabled from writableCalendars; a
  last-used preselect on a now-disabled calendar falls back to the first
  remaining writable one.
- ImportViewModel: exclude disabled from the import target list.
- CalendarsScreen/ViewModel: per-row enable/disable Switch on both the
  local and synced groups; disabled rows render dimmed (new GroupedRow
  `dimmed` flag) while keeping the toggle live.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs(changelog): note in-app calendar enable/disable
All checks were successful
Translations / check (pull_request) Successful in 5s
CI / ci (pull_request) Successful in 4m49s
814daa8151
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
makiolaj added 1 commit 2026-06-25 12:23:22 +00:00
Merge remote-tracking branch 'origin/release/v2.10.0' into feat/disable-calendar
All checks were successful
Translations / check (pull_request) Successful in 5s
CI / ci (pull_request) Successful in 8m57s
bf10fee19f
# Conflicts:
#	CHANGELOG.md
makiolaj merged commit d0c01ab8c4 into release/v2.10.0 2026-06-25 12:28:32 +00:00
makiolaj deleted branch feat/disable-calendar 2026-06-25 12:28:32 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: makiolaj/calendula#38