Description
Assigning tags to invoices one at a time from the detail page is impractical when a user wants to tag a batch of invoices with the same label after a project completes. A tag assignment action in the multi-select toolbar (Issue 47) should allow applying one or more tags to all selected invoices in a single operation.
Technical Context
src/components/invoice/BulkActionToolbar.tsx (from Issue 47) adds a "Tag" dropdown that opens src/components/invoice/BulkTagModal.tsx (new). The modal renders a TagInput component (from Issue 11) and a "Apply to N invoices" confirm button. On confirm, a single PATCH /api/invoices/bulk request with { ids: string[], addTags: string[] } body is sent via src/lib/api.ts. The list updates optimistically using mutate from swr.
Acceptance Criteria
Description
Assigning tags to invoices one at a time from the detail page is impractical when a user wants to tag a batch of invoices with the same label after a project completes. A tag assignment action in the multi-select toolbar (Issue 47) should allow applying one or more tags to all selected invoices in a single operation.
Technical Context
src/components/invoice/BulkActionToolbar.tsx(from Issue 47) adds a "Tag" dropdown that openssrc/components/invoice/BulkTagModal.tsx(new). The modal renders aTagInputcomponent (from Issue 11) and a "Apply to N invoices" confirm button. On confirm, a singlePATCH /api/invoices/bulkrequest with{ ids: string[], addTags: string[] }body is sent viasrc/lib/api.ts. The list updates optimistically usingmutatefromswr.Acceptance Criteria