Commit Graph

37 Commits

Author SHA1 Message Date
d8c30cdb1f fix: double event on recurring create + mobile sticky day bar
- Skip optimistic UI update for new recurring events (causes duplicate
  when force-sync fetches expanded instances with different IDs)
- Mobile sticky day bar: listen on gridRef scroll instead of window
  (time-grid scrolls inside weekly-days-grid, not window)
- Remove broken position:sticky from mobile day headers (CSS sticky
  doesn't work inside CSS grid scroll containers); use fixed overlay only
- Also propagate isRecurring flag in create response for Google/Outlook

v1.75.8

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 09:34:09 +02:00
77e8e87b90 fix: eliminate extra iCloud login during sync - use stored calendars
Apple sync was doing 2 logins per cycle: getAppleCalendars (to get calendar
list for filtering) + getUpcomingEventsBatch (to fetch events). Now uses
stored calendar metadata from DB for filtering, reducing to 1 login total.

Same optimization applied to Synology. Also adds 24:00 end-of-day line
to time grid, and throttles tab-focus sync to max once per 5 minutes.

v1.75.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 10:58:09 +01:00
f6e158af8f fix: reduce iCloud CalDAV connections to prevent rate limiting
- Apple/Synology: batch fetch events with single client login instead of N separate connections
- Apple: add client cache (5min TTL) to reuse authenticated DAVClient across operations
- Apple: add retry with backoff for transient ConnectTimeoutError/SSL failures
- Increase cache stale threshold from 2min to 15min
- Increase background sync interval from 2min to 15min
- Throttle tab-focus sync to at most once per 5min

v1.75.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 09:35:25 +01:00
11e7b14c17 fix: add debug logging for Outlook recurring event updates
Log the event ID decomposition, update payload, and Graph API
response status to diagnose why recurring event updates aren't
persisting for Outlook.

v1.74.8

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 14:39:50 +01:00
08959c6ddb feat: drag-to-create calendar events, fix rolling tasks, fix Outlook recurring
- Drag on empty time slots to create calendar events with pre-filled time range
- Rolling tasks now work per-task without requiring global autoRolling setting
- Add firstDayOfWeek to Outlook weekly recurrence patterns
- Add debug logging for Outlook recurrence creation

v1.72.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 01:56:16 +01:00
da2ebbedb5 feat: show location in events, fix HTML in notes, fix CalDAV TZID, reduce collapsed all-day space
- Strip HTML tags from descriptions before sending to CalDAV providers (Apple/Synology)
- Show event location underneath time in calendar event blocks (like Google Calendar)
- Fix German umlaut rendering by adding latin-ext font subset
- Fix CalDAV event updates losing TZID on DTSTART/DTEND (Apple Calendar recurring edit fix)
- Add error logging for CalDAV PUT responses
- Reduce wasted space when all-day events section is collapsed (24px max)
- Fix quotes with missing umlauts (ä, ö, ü, ß)

v1.71.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 22:14:21 +01:00
346583fe78 fix: Google recurring event timezone + Outlook DST shift + Outlook delete
- Google: add timeZone to start/end objects when recurrence is present
  (fixes "Missing time zone definition for start time" error)
- Outlook: pass user timezone instead of UTC for event create/update,
  convert UTC dateTime to local representation (fixes +1h DST shift
  on recurring instances)
- Outlook: use instance ID for single-occurrence delete instead of
  series master ID (fixes ErrorItemNotFound on delete)

v1.63.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:16:05 +01:00
6584b9c266 feat: add 'This & past' recurring event delete option
Adds a fourth delete option for recurring events: delete this instance
and all past occurrences. For CalDAV (Apple/Synology), this moves
DTSTART forward to the next occurrence. Includes optimistic UI removal.

v1.63.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 00:40:48 +01:00
8abbf4a286 fix: Outlook UTC date parsing and event deduplication
- Outlook returns dateTime without Z suffix despite timeZone being UTC,
  causing JS to parse as local time (1h shift). Now appends Z for UTC dates.
- Added frontend deduplication to prevent stacked rendering of duplicate events.
- Added Outlook event debug logging for recurring event investigation.

v1.62.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 00:22:56 +01:00
c302a036bb fix: pass isRecurring/recurringEventId for Google and Outlook events
Google and Outlook event mappings were missing isRecurring and
recurringEventId fields, so the modal never showed recurring delete
options and displayed recurring events as "Repeat: Never".

v1.62.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:49:40 +01:00
57eeb3d8e8 feat: recurring event delete options (this/future/all instances)
When deleting a recurring calendar event, users now choose between
deleting just this instance, this and future instances, or all instances.
Supports Google, Apple (iCloud), and Synology CalDAV providers.

v1.62.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 22:06:23 +01:00
1011aef639 fix: recurring event DST time shift and block height overflow
- Use TZID-based local time (instead of UTC 'Z') for DTSTART/DTEND
  when creating recurring CalDAV events, preventing DST-related time
  shifts (e.g. 13:40 CET showing as 14:40 CEST after clock change)
- Send browser timezone from CalendarEventModal to server
- Guard against NaN event duration (missing/invalid endTime) which
  caused event blocks to stretch to end of day

v1.61.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 21:23:24 +01:00
c5dc315f82 feat: sync calendar colors from all providers and add custom recurrence
- Store calendar colors (backgroundColor) from Apple and Synology
  during connection setup
- Auto-refresh missing colors for existing Apple/Synology connections
- Show color dots next to calendar names in settings
- Add "Custom..." recurrence option with interval (every N days/weeks/
  months/years) and day-of-week selection for weekly recurrence
- Generate proper RRULE with INTERVAL and BYDAY for all providers
- Generate proper Outlook Graph recurrence with custom intervals

v1.61.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:35:22 +01:00
1ab98025a6 feat: add Outlook calendar colors and recurrence end date/count
- Fetch and display Outlook calendar colors from Microsoft Graph API
  instead of hardcoded blue
- Add recurrence end options to calendar event modal: Never, On Date
  (UNTIL), or After X occurrences (COUNT)
- Pass recurrence end parameters through to RRULE generation for all
  providers (Google, Apple, Synology, Outlook)

v1.60.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:14:13 +01:00
3ec5a21714 fix: Apple Calendar ignoring selection state, causing duplicate events
Apple calendar events were fetched from ALL calendars regardless of the
user's Display checkbox selection. Now respects the stored selected state,
matching the behavior of Synology/Google/Outlook providers.

Also reverts the title-based deduplication which was too aggressive.

v1.57.7

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:12:28 +01:00
93e808ddfa fix: auto-prune deleted Synology calendars during event fetch
When a Synology calendar returns 404 during event fetch, remove it from
the stored calendar list instead of silently returning empty results.

v1.57.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 23:06:02 +01:00
ee4b540558 feat: add Notion provider integration + Apple Reminders deprecation note
- Notion OAuth integration: start/callback routes, calendar-events dispatch,
  CRUD operations (create/update/delete via Notion API)
- New notion-calendar.ts provider library with database discovery
- Onboarding wizard: expanded to 6 steps (header/tasks/display design),
  improved preview fidelity, universal dummy content, Notion in connect step
- Apple Calendar: label changed to "events only", added warning that
  Reminders are unsupported since iOS 13 (no CalDAV/API from Apple)
- Fixed 12h time format on now-line, wizard settings apply on completion

v1.57.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 21:02:25 +01:00
0fa2893e10 fix: prune deleted Synology calendars from stored list
When fetching events, refresh the calendar list from the Synology
server and remove any stored calendars that no longer exist. This
stops repeated "Calendar unavailable" errors from deleted calendars.

v1.37.3
2026-03-16 22:28:28 +01:00
b9c05571be feat: add alerts, invitees, attachments, busy status, and visibility to calendar events
Support extended calendar event properties across all providers:
- Alerts/Reminders: VALARM for CalDAV, reminders API for Google, reminderMinutes for Outlook
- Invitees/Attendees: ATTENDEE for CalDAV, attendees API for Google/Outlook
- Attachments: ATTACH (URL-based) for CalDAV (Apple/Synology)
- Busy Status: TRANSP for CalDAV, transparency for Google, showAs for Outlook
- Visibility: CLASS for CalDAV, visibility for Google, sensitivity for Outlook

Updated CalendarEventModal with new UI fields including expandable
Invitees & Attachments section and reminder/status/visibility dropdowns.

v1.36.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:36:37 +01:00
ef22fb5046 Fix linting errors and Synology rootUrl issue 2026-03-13 13:40:39 +01:00
2819068d4d Fix all-day event shifts and header UI overlap 2026-03-13 12:11:12 +01:00
499b012d82 fix: CSS class slide animation, mobile dot, flex task indicators 2026-03-06 12:09:13 +01:00
163e9c1a07 feat: major update — mobile fix, auth decoupling, CalDAV perf, projects, fonts, quotes
Mobile fixes:
- Add viewport meta tag (was missing, causing broken mobile rendering)
- Make header nav controls visible on mobile (opacity-0 group-hover was invisible on touch)
- Add touch swipe gestures for day navigation on mobile
- Fix viewDays responsive override after profile load

Bug fixes:
- Fix goal save (WeeklyView used POST but route only had GET/PUT; fix to use PUT, add POST alias)
- Fix body key mismatch (goal → text) in goal save request

Auth & identity (Task 1):
- Add accountNumber (auto-increment) to User model for stable identity
- Fix OAuth flows: pass user CUID in state instead of email
- Google/Outlook callbacks now look up users by ID, not email
- Non-Gmail users can now connect Google Calendar/Tasks

CalDAV performance (Task 5):
- Embed CalDAV object URL in Apple event IDs (caldav::<url>::<uid> format)
- Delete/update now use O(1) direct URL access instead of O(n) full calendar scan
- Optimistic UI removal on delete (no blocking force-refresh)
- Legacy fallback for old-format IDs during transition

Apple Calendar data (Task 2):
- Pass URL, location, recurringEventId, isRecurring through full pipeline
- Add url, recurringEventId, isRecurring to CachedCalendarEvent schema
- Calendar cache now reads/writes all new fields

Projects (Task 6):
- New Project model (name, icon, color, description, order)
- CRUD API at /api/tasks/projects
- Tasks now support optional projectId with cascading nullify

Quotes (Task 4):
- Curated local quote database (50 quotes, DE+EN) with tag filtering
- Preset quote source APIs (ZenQuotes, Quotable, Forismatic, Type.fit)

Fonts (Task 7):
- FontPicker component with searchable dropdown and live preview
- /api/fonts endpoint (Google Fonts API proxy with 24h cache, fallback to 40 popular fonts)

Quick Settings (Task 8):
- QuickSettingsSidebar component (font size, spacing, show completed, start day, show lines)
- New user preferences: showCompletedTasks, showLines, startDayOffset, quoteSourceUrls

v1.9.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:55:49 +01:00
fcaadc1ce9 Refactor Someday area to grid layout with dynamic slots, fixed scrolling, and border refinements 2026-03-01 11:58:48 +01:00
279d1a4c49 Fix notes popup positioning, reposition task actions to avoid overlap, and improve Apple Calendar sync 2026-02-24 12:58:19 +01:00
368928c016 Reposition notes popup to floating vertical container and various integration fixes 2026-02-24 12:26:02 +01:00
8842123caf feat: improve calendar sync, event modal, and task list management
- Fix All Day checkbox positioning in CalendarEventModal (own row)
- Add provider name to calendar dropdown (Google/Apple/Outlook)
- Optimistic UI updates after event save/delete (no reload needed)
- Force-refresh calendar cache after event mutations
- Reduce background sync interval from 5min to 2min
- Support forceRefresh in background-sync API
- Use shared Prisma singleton in tasks sync route
- Add per-provider task list fetching and sync checkboxes
- Add allDay support to event creation and editing

v1.4.0
2026-02-24 11:01:15 +01:00
866f514f10 fix: detect iCloud all-day events and bypass cache on manual refresh
- Apple calendar parser now checks ICAL.js isDate flag and emits
  date-only strings (YYYY-MM-DD) for all-day events instead of
  full ISO datetime — fixes all-day detection in the frontend
- Calendar events mapper routes date-only Apple events to the
  date field instead of always using dateTime
- Manual refresh button now sends forceRefresh=true which makes
  the sync endpoint wait for live data instead of returning stale cache
- Automatic background syncs still use fire-and-forget for performance

v1.2.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:26:04 +01:00
db00642c21 feat: Add Microsoft To-Do and Outlook Calendar integration
Adds full OAuth2 flow, bidirectional task sync, calendar event CRUD,
caching with background refresh, and shared token management for
Microsoft/Outlook services. Extracts common token refresh logic into
shared outlook-token.ts utility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 22:07:37 +01:00
ccb34d12d5 feat: Add soft delete, remove Apple Reminders, improve Google Tasks sync
Add soft-delete support for tasks with deletedAt field and migration.
Remove Apple Reminders iCloud integration entirely (API routes, lib,
UI modal, and Python script) in favor of CalDAV approach. Add periodic
pull-sync from Google Tasks every 2 minutes with deletion detection.
Fix orphaned someday task rescue and cross-list task toggle/edit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 09:04:49 +01:00
798bcfe44a feat: Add Google Tasks, Apple Reminders, task import/sync, holidays, and UI enhancements
- Add Google Tasks integration and Apple Reminders support
- Add task import/export with list management APIs
- Add goal API for weekly goals
- Add German holidays library
- Add ImportListModal component
- Enhance WeeklyView with major UI improvements
- Enhance CalendarSettings with new connection options
- Add external task fields to database schema
- Add Playwright test suites for auth and tasks
- Add iCloud reminders Python scripts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 16:56:14 +01:00
192c418223 Fix task creation and other updates 2026-02-18 14:36:34 +01:00
46dbf2ac02 Configure app for HTTPS reverse proxy on custom domain 2026-02-18 01:48:33 +01:00
64955ad07b Refactor Apple Calendar integration and sync logic 2026-02-17 15:30:42 +01:00
e9a0a706b7 Fix header layout, add day/night switch, refine night mode styling 2026-02-12 20:14:12 +01:00
d054144939 feat: localize app to German and add configurable day hours 2026-02-09 12:11:52 +01:00
d92a8c7210 feat: add task actions (notes/delete) and refine animation logic
- Added 'onDelete' and 'onNotes' support to TaskItem.
- Implemented hover actions (Delete and Notes icons) for tasks.
- Added Notes Modal for editing task markdown content.
- Simplified navigation animation to remove blank flash (single-phase slide-in).
- Fixed syntax error in updateTask function.
- Updated styles for modal and task actions.
2026-02-01 12:25:53 +01:00