Skip to content

Allow bulk update of movies, music and games #89

@mforce

Description

@mforce

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions