Replace removed Schedule type and api.listSchedules() with
ShiftInstance and api.listShifts() after the schedule rewrite.
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
When the database has no users, the UI redirects to /setup and prompts
for creation of the first admin account. The setup endpoints are
self-disabling — once any user exists, POST /setup/admin returns 403
and the frontend redirects /setup back to /login. The backend uses an
atomic transaction to prevent race conditions on concurrent requests.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Initialize slice helpers with make() instead of var declaration so
empty results serialize as [] instead of null in JSON, fixing the
frontend TypeError on the schedules page.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Replace bare http.FileServer with an SPA-aware handler that tries to
serve the requested static file and falls back to index.html when
the path doesn't match a real file. This lets React Router handle
client-side routes like /schedules on page reload.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- /schedules?year=2026&month=4 for the shifts view
- /schedules/templates for the templates view
- Month navigation updates search params via useNavigate
- Reloading or sharing a URL restores the exact view
Co-Authored-By: Claude Opus 4.6 <[email protected]>
The edit form now loads the volunteer list and groups them by
operational role. Template role requirements are shown with a
count indicator (selected/required) that turns green when filled.
Volunteers are selected via checkboxes instead of typing IDs.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
The edit form now fetches approved time-off requests and excludes
volunteers whose time off overlaps the shift date from the
selectable list. Unavailable volunteers are shown below the picker
in a "On approved time off" note.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
shift_templates,shift_template_roles,shift_template_volunteers,shift_instances,shift_instance_volunteersAPI
/api/v1/shift-templates/api/v1/shift-templates/api/v1/shift-templates/{id}/api/v1/shift-templates/{id}/api/v1/shifts?year=&month=/api/v1/shifts/generate/api/v1/shifts/publish/api/v1/shifts/unpublish/api/v1/shifts/{id}/api/v1/shifts/{id}/confirmTest plan
go vet ./...— cleango test ./internal/schedule/...— 14 handler tests passSchedules.test.tsx)Closes #2