Problem
Right now every field change requires editing items one at a time through the detail view. This is fine for occasional tweaks but becomes tedious for common batch operations like:
- Setting tags on a group of items (e.g. tagging everything acquired in 2025)
- Updating status (e.g. marking 20 movies as "Watched")
- Setting personal rating on recently watched items
- Updating condition, acquisition source, or other shared metadata
Proposed solution
Add a bulk update flow to the collection list pages (Movies, Music, Games):
1. Item selection
- Add a checkbox to each card/row in
CollectionList (hidden by default, toggled via a "Select" mode button in the toolbar)
- Support "Select all visible" toggle in the toolbar
- Show selection count in toolbar (e.g. "12 selected")
2. Bulk action bar
- When items are selected, show a floating or inline action bar with:
- Bulk update… → opens a modal/drawer with fields to update
- Delete → confirm & delete selected (reuses existing
DELETE /api/:type/:id in a batch)
3. Bulk update modal
- Show only the common fields shared across all three types (from
CollectionItemBase):
- Tags (add/remove)
- Status
- Personal rating
- Condition
- Notes (append mode)
- Plus type-specific fields where it makes sense:
- Movies: WatchStatus, formats
- Games: PlayStatus
- Each field shows current value distribution for selected items (e.g. "Status: 8 Owned, 4 Want") to make it clear what is being changed
4. Backend API
New endpoint on each resource group:
PATCH /api/movies/bulk
PATCH /api/music/bulk
PATCH /api/games/bulk
Payload:
{
"ids": [1, 5, 12, 47],
"updates": {
"status": "watched",
"tags": { "add": ["favorites"], "remove": ["backlog"] },
"personalRating": 8
}
}
- Only non-null fields in
updates are applied (partial update semantics)
- All items must belong to the current user (OwnerId filter)
- Return count of updated items + any errors per ID (e.g. if an ID was already deleted)
5. Frontend hooks
- New TanStack Query mutation
useBulkUpdate(type) in api/
- Selection state managed locally in
CollectionList (no URL state needed for MVP)
- Invalidate
[type] query key on success to refresh the list
Out of scope (follow-ups)
- Bulk import via CSV (separate issue)
- Bulk cover image updates
- Undo/redo for bulk operations
Verification
dotnet build clean, npm run build clean
- Select 5+ movies, bulk-update status and tags → confirm DB reflects changes
- Try bulk-updating items owned by another user → rejected (multi-user, Phase 4)
- Try bulk-updating with empty ID list → 400 Bad Request
Problem
Right now every field change requires editing items one at a time through the detail view. This is fine for occasional tweaks but becomes tedious for common batch operations like:
Proposed solution
Add a bulk update flow to the collection list pages (Movies, Music, Games):
1. Item selection
CollectionList(hidden by default, toggled via a "Select" mode button in the toolbar)2. Bulk action bar
DELETE /api/:type/:idin a batch)3. Bulk update modal
CollectionItemBase):4. Backend API
New endpoint on each resource group:
Payload:
{ "ids": [1, 5, 12, 47], "updates": { "status": "watched", "tags": { "add": ["favorites"], "remove": ["backlog"] }, "personalRating": 8 } }updatesare applied (partial update semantics)5. Frontend hooks
useBulkUpdate(type)inapi/CollectionList(no URL state needed for MVP)[type]query key on success to refresh the listOut of scope (follow-ups)
Verification
dotnet buildclean,npm run buildclean