Both Google Calendar and Nextcloud CalDAV now create all-day events for
shifts that have no MorningTime or AfternoonTime configured, instead of
silently skipping them. Fixes month-boundary crash on day 31 by using
DateOnly.AddDays(1) for the end date.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces hand-rolled retry logic with Microsoft.Extensions.Http.Resilience
(Polly v8). The named 'nextcloud' HttpClient retries up to 3 times on 429
with exponential backoff (2s, 4s, 8s). Also adds a 300ms delay after every
individual PUT/DELETE request to reduce burst rate.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements a provider-agnostic calendar sync feature with Nextcloud as the
first alternative to Google Calendar.
- Add ICalendarService interface and provider-agnostic API endpoints
- Implement NextcloudCalendarService using CalDAV (Ical.Net)
- Add CalendarEventBuilder to share event/transport logic across providers
- Add Nextcloud sync button to the UI (Index page)
- Centralise TargetFramework, Nullable and ImplicitUsings in Directory.Build.props (net9.0)
- Add .worktrees to .gitignore and Docker/Nextcloud config docs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Initial plan
* Initial setup: Downgrade .NET version to 8.0 for compatibility
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Implement enhanced shift handling with file system storage and month selection
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Move component styles from global app.css to Index.razor.css for proper component isolation
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Initial plan
* Initial project setup - update to .NET 8.0 for compatibility
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Complete SBB transport integration implementation
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Revert to .NET 9 and separate transport info into ShiftTransport class
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Make safety buffer minutes configurable via appsettings
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Migrade pdf export service
* Update gitignore
* Implement new approach: real-time transport data per shift selection with ShiftWithTransport view model
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Refactor export methods to directly use ShiftWithTransport instead of converting to separate parameters
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Move ShiftWithTransport class to its own file
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
* Code cleanup
* Fix transport timing logic to respect safety buffer and find best available connections
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
Co-authored-by: clayschaad <c.schaad@pog.ch>
Co-authored-by: Claudio Schaad <clayschaad@users.noreply.github.com>