- Status filter replaced by folder tabs (All open / Overdue / In progress /
Temp fix / On hold) with live count badges; tabs, priority and category
filters now applied client-side so counts always match
- Priority filter badges with counts; sort is now a dropdown list
- New hold_booked status (contractor booked), grouped with in progress, with
optional booked date stored in hold_until; hold_until cleared when leaving
the date-bearing holds
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Photos open in a full-screen lightbox overlay instead of navigating to a new tab (fixes PWA back-button issue)
- DB migration adds photo_id to task_events; photo upload logs the reference so activity timeline can show a clickable thumbnail for each 'Photo added' event
- Edit and Delete buttons moved to a quiet ghost-button footer at the bottom-right of the modal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When a task is created or reassigned to a staff member, a push notification
is sent to any devices they have subscribed on. Keys are auto-generated on
first boot and stored in the config table (no manual VAPID setup needed).
- Backend: web-push dep, push_subscriptions table, lib/push.js (VAPID +
send), routes/push.js (vapid-key / subscribe / unsubscribe endpoints),
push notify wired into task-core createTask and tasks PATCH reassignment
- Frontend: switched vite-plugin-pwa to injectManifest strategy, custom
sw.js handles precache + push event + notificationclick, usePushSubscription
hook requests permission and registers subscription on login
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>