Commit Graph

226 Commits

Author SHA1 Message Date
8926fe27c2 fix: restore sticky day headers on mobile in simple view
overflow-x: hidden on .simple-view .weekly-day-column was creating a
scrolling context that broke position: sticky on the day header.
Changed to overflow-x: clip which clips content without affecting sticky.

v1.73.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:57:11 +01:00
dd16e5604a fix: restore sticky day headers on mobile
Non-passive touchmove listener was permanently attached to document,
breaking browser scroll optimizations. Now only attached during active
long-press and removed immediately after.

v1.73.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:38:02 +01:00
98a47a62de feat: long-press drag-to-create calendar events on mobile
Tap and hold (~500ms) on an empty time slot to activate, then drag to
select time range. Opens calendar event modal with pre-filled times.
Includes haptic vibration feedback on activation. Normal tap and scroll
gestures are not affected.

v1.73.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:29:19 +01:00
39934d23bf fix: rolling tasks now properly avoid overlapping existing tasks
Collision detection rewritten to check duration-based overlap instead
of exact startTime match. Rolling tasks find the next truly free slot.

v1.72.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:12:05 +01:00
e1190a8fe6 fix: attach calendar color to created/updated events for cache + frontend
Events created or updated via the API were missing the calendar's
backgroundColor, causing them to render without their provider color.

v1.72.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 02:10:11 +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
131f92bd72 fix: Outlook event timezone offset on create/update responses
Outlook Graph API returns datetimes in the user's timezone without Z suffix
by default. The sync path already requested UTC and appended Z, but
create/update responses did not. This caused the optimistic UI update to
show events 1 hour off until the next sync corrected it.

Fix: add Prefer: outlook.timezone="UTC" header to create/update calls
and normalize response datetimes with Z suffix.

v1.71.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 00:03:17 +01:00
92593cf616 fix: prevent Prisma connection pool exhaustion in production
Cache PrismaClient globally in ALL environments (was only cached in dev).
Without this, production could create multiple PrismaClient instances,
each with its own connection pool, exhausting the database connections.

v1.71.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 23:17:29 +01:00
e1e31cef20 fix: use updateCalendarObject instead of updateObject for CalDAV updates
iCloud returned 501 Not Implemented for updateObject calls.
Switch to updateCalendarObject which properly sends CalDAV PUT requests.
Fixed in both Apple Calendar and Synology Calendar update + recurring delete paths.

v1.71.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 22:27:35 +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
948d239867 feat: redesign recurring edit dialogs with Google Calendar style and i18n
- Redesigned drag/resize and modal recurring edit dialogs with radio buttons
  (This event / This and following / All events) with descriptions
- Added German/English i18n to both recurring edit dialogs
- Repeat-on day buttons now respect weekStartDay setting (Mon/Sun start)
- Added language prop to CalendarEventModal

v1.70.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 16:40:33 +01:00
74a8c9a9a9 feat: recurring event edit confirmation (this event / all events)
When editing a recurring calendar event (via modal or drag/resize),
the user is now asked whether changes apply to just this instance or
all events in the series.

- Modal: Save button shows "This event" / "All events" options for
  recurring events
- Drag/resize: centered overlay prompt with same options + cancel
- API PATCH: editMode=all routes update to the series master ID
  (recurringEventId) instead of the instance ID
- Cancel on drag prompt reverts to original position

v1.69.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:41:21 +01:00
ff3d458b6d fix: reduce external API calls ~10x by optimizing sync intervals
Root cause: background calendar sync every 2min with forceRefresh:true
+ task sync every 5min + cache stale threshold of 2min = 12,500+
Google Calendar + 8,800 Google Tasks API calls/day for a single user.

Changes:
- Calendar background sync: 2min → 15min
- Task sync polling: 5min → 15min
- Cache stale threshold: 2min → 15min
- Remove forceRefresh:true from background sync (let staleness check
  decide naturally)
- Remove redundant 8s re-fetch after background sync
- User actions (create/update/delete) still sync immediately

Expected reduction: ~10-15x fewer external API calls.

v1.68.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:35:22 +01:00
13bd90bd2a fix: cross-day drag-and-drop + persist showCalendarProviderIcon setting
- Cross-day drag now works: getEventsForSlot uses drag state's current
  start time to assign the dragged event to the correct day column
- Add showCalendarProviderIcon to Prisma schema, profile API GET/PATCH
  so the setting persists across sessions (was frontend-only before)
- DB migration applied via prisma db push

v1.68.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:30:42 +01:00
343cc87e4d fix: strip HTML tags from event description in note tooltip
Calendar providers return descriptions with HTML tags (e.g. <p>test</p>).
Strip them before displaying in the hover tooltip.

v1.67.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:26:58 +01:00
1e789d93ae feat: cross-day drag, note icon, Google recurring fix, no popup on drag
- Fix Google recurring events missing isRecurring flag (recurringEventId
  was not mapped from Google API response)
- Add note icon (FileText) on events with descriptions, tooltip on hover
- Cross-day drag-and-drop: detect day column under cursor and shift date
- Fix event detail popup opening after drag/resize by setting ref before
  async operations
- Add data-date attribute to day columns for drag target detection
- Use CSS class for icon row layout to prevent overlap

v1.67.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 12:03:33 +01:00
dbe60dd331 fix: deduplicate recurring event masters vs expanded instances
Recurring events appeared twice on their creation day because both the
series master (from POST cache) and the expanded instance (from sync)
had different IDs. Now filters out masters when instances exist, and
also deduplicates by title+startTime+calendarId as a fallback.

v1.66.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:55:39 +01:00
13de53fe0a feat: drag-to-move and resize handles for calendar events
Add resize handles (top/bottom) on hover to change event duration, and
drag-to-move support with live preview and 5-minute snapping. Includes
3px dead zone to distinguish clicks from drags, optimistic UI updates
with server rollback on failure, and recurring/provider icons on
time-grid events. Also fixes Google delete 410 Gone and Outlook delete
404/encodeURIComponent issues.

v1.66.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:35:01 +01:00
c040dd982d fix: remove CSS left/right overrides preventing side-by-side events
The base .time-slot-event and .simple-view .time-slot-event CSS had
left: 0 and right: 0 (with !important) which overrode the inline
overlap layout positioning. Removed so events can be placed side by
side when they overlap.

v1.65.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:16:46 +01:00
ba4f1ca280 feat: overlapping calendar events side by side + Outlook delete fix
- Overlapping calendar events on the same time slot are now rendered
  side by side instead of stacked on top of each other. Uses a greedy
  column assignment algorithm to compute layout per day.
- Outlook delete/update: use /me/events/{id} as primary endpoint
  (without encodeURIComponent) instead of calendar-scoped endpoint,
  with fallback. Fixes ErrorItemNotFound for recurring series masters.

v1.65.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 11:06:00 +01:00
e00834e0bb feat: optional provider icon on calendar event blocks
Adds a toggle in Calendar settings to show the provider icon
(Google/Apple/Outlook/Synology) in the bottom-right corner of
calendar event blocks. The recurring icon is grouped alongside
when both are visible.

v1.64.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:56:49 +01:00
18c2fc1a92 fix: Outlook update/delete fallback to non-calendar-scoped endpoint
When the calendar-scoped Graph API endpoint returns 404 for series
master or instance IDs, fall back to /me/events/{id} which handles
these cases. Fixes ErrorItemNotFound on delete/update of recurring
Outlook events.

v1.63.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:51:03 +01:00
c718aa584a fix: respect TZID when updating CalDAV event start/end times
When updating Apple/Synology events that have DTSTART with a TZID
parameter, convert the incoming UTC dateTime to local time in that
timezone before writing back. Prevents ICAL.js from storing UTC
values under a local timezone, which caused +1h shifts on update.

v1.63.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:42:13 +01:00
c69a7d92a8 fix: show timezone in Localisation settings
Display the browser-detected timezone (e.g. Europe/Berlin) as a
read-only field in the Localisation settings tab.

v1.63.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:38:39 +01:00
fb7484c357 fix: CalDAV TZID parsing + recurring event icon on all providers
- Add icalTimeToUtcDate() helper to Apple/Synology parsers that
  correctly converts ICAL.Time with unresolved TZIDs to UTC dates
  (fixes +1h shift on Synology/Apple recurring events across DST)
- Add recurring icon (Repeat) to bottom-right of all calendar event
  blocks when event.isRecurring is true

v1.63.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:24:38 +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
c00f691f1f fix: use calendar-scoped Graph API endpoint for Outlook event update/delete
Events fetched via /calendarView must be addressed via
/me/calendars/{calendarId}/events/{eventId}, not /me/events/{eventId}.
The latter returns ErrorItemNotFound for calendar-view instance IDs.

v1.62.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:37: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
6fc0ccef74 fix: inline project icons so multi-line text wraps around them
Move project icons from flex siblings into the text span so that
multi-line task titles wrap around the icon instead of leaving
empty space below it.

v1.59.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:58:43 +01:00
b6f5ba42ed fix: show project icons in time grid (GridTaskBlock) view
Add showProjectIcons prop to GridTaskBlock so project icons appear
next to task titles in simple and calendar views, not just list view.

v1.59.3
2026-03-23 13:17:06 +01:00
ccd069ae80 fix: add 'Show Icons for Projects' toggle to settings modal
Per-view setting with translations in all 5 languages (EN, DE, FR, ES, IT).

v1.59.2
2026-03-23 12:45:35 +01:00
b26d710fec fix: move sidebar toggle into header toolbar, left of view switcher
Removes the fixed-position button and places it inline in the desktop
header controls row with matching hover-to-reveal behavior.

v1.59.1
2026-03-23 12:38:38 +01:00
d7eeafb08f feat: add 'Project Icons' toggle to show icons on tasks
New per-view setting to display project icons next to task titles in
simple, calendar, and list views. Toggle via Quick Settings sidebar,
similar to the existing 'Checkboxes' toggle.

v1.59.0
2026-03-23 12:31:19 +01:00
3061ac09d0 fix: add cross icon to icon picker
v1.58.3
2026-03-23 12:27:05 +01:00
301e5f9829 feat: expand icon picker to ~490 icons
Add ~240 more MDI icons covering outdoor/adventure, animals, food/kitchen,
vehicles, tools/construction, fun/toys, lifestyle, sports, and more.

v1.58.2
2026-03-23 12:13:11 +01:00
09ae6d6a2d fix: close project picker on mouse leave and outside click
v1.58.1
2026-03-23 11:15:08 +01:00
9093149f5e feat: improved icon picker with search, FontAwesome and MDI icons
Replace the small grid of ~45 icons with a searchable IconPicker component
featuring ~250 icons from FontAwesome and Material Design Icons. Includes
keyword search, library tabs (All/FA/MDI), and categories covering tech,
home, sports, food, nature, finance, health, and more.

v1.58.0
2026-03-23 11:13:21 +01:00
7e11b261a3 fix: move sidebar toggle button from bottom-left to top-left
v1.57.16
2026-03-23 10:29:38 +01:00
3da2acadf1 fix: project picker dropdown stays visible and above other tasks
Add picker-open class when project picker is shown to keep task-actions
visible even when mouse leaves the task hover area. Elevate z-index on
picker-open tasks so the dropdown isn't obscured by adjacent tasks.

v1.57.15
2026-03-23 10:28:17 +01:00
02ae5a46f8 chore: remove Synology calendar debug logging
v1.57.14

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 01:49:21 +01:00
8402adbd45 fix: always full-fetch Google Tasks for linked someday lists
The updatedMin optimization skipped tasks that were missed during
initial sync. Now does a full fetch when a someday list is linked,
ensuring all remote tasks are discovered.

v1.57.13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 01:35:56 +01:00
a009a4953a fix: paginate task sync and unblock connections endpoint
- Google Tasks and Microsoft To-Do sync now paginate through all
  results instead of capping at 100 tasks per list.
- Synology calendar pruning in GET /connections is now fire-and-forget
  so a slow/unreachable NAS doesn't block the entire response.

v1.57.12

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 01:11:23 +01:00
a5295c5dd7 fix: retry Outlook API calls on 429 throttling with backoff
Respects Retry-After header when available, otherwise uses
exponential backoff (2s, 4s, 6s) for up to 3 attempts.

v1.57.11

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:47:52 +01:00
87aeb8ad47 fix: someday list delete buttons obscured by task items below
Raise z-index on the list header when delete confirmation is active
so Cancel/Delete buttons render above the task list items.

v1.57.10

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:37:24 +01:00