# Implementation Plan

- [x] 1. Set up backend bulk action endpoints





  - Create bulk status update endpoint in `backend/routers/tasks.py`
  - Create bulk assignment endpoint in `backend/routers/tasks.py`
  - Implement transaction handling for atomicity
  - Add request/response schemas in `backend/schemas/task.py`
  - _Requirements: 4.2, 4.4, 5.3, 5.5_

- [ ]* 1.1 Write property test for bulk status update atomicity
  - **Property 4: Bulk status update atomicity**
  - **Validates: Requirements 4.2, 4.4**

- [ ]* 1.2 Write property test for bulk assignment atomicity
  - **Property 5: Bulk assignment atomicity**
  - **Validates: Requirements 5.3, 5.5**

- [x] 2. Update task service with bulk action methods




  - Add `bulkUpdateStatus` method to `frontend/src/services/task.ts`
  - Add `bulkAssignTasks` method to `frontend/src/services/task.ts`
  - Define TypeScript interfaces for bulk action requests and responses
  - _Requirements: 4.2, 5.3_

- [x] 3. Add checkbox selection column to TaskBrowser





  - Update `frontend/src/components/task/columns.ts` to add select column
  - Implement header checkbox for select all functionality
  - Implement row checkboxes for individual selection
  - Ensure checkbox column is not sortable or hideable
  - _Requirements: 1.1, 1.2, 1.3_

- [ ]* 3.1 Write property test for selection state consistency
  - **Property 1: Selection state consistency**
  - **Validates: Requirements 1.2, 1.3, 2.3**

- [x] 4. Implement row selection state in TaskBrowser




  - Add `rowSelection` state using TanStack Table's row selection
  - Configure table with `enableRowSelection: true`
  - Add computed property for `selectedTasks` array
  - Add computed property for `selectedCount`
  - Implement visual feedback for selected rows (background highlight)
  - _Requirements: 1.2, 1.3, 1.4, 2.1, 2.2, 2.3_

- [x] 5. Implement selection count display


  - Update task count display area to show selection count when tasks are selected
  - Show format: "X tasks selected" when selection is active
  - Show normal count when no selection
  - _Requirements: 2.1, 2.2, 2.3_

- [x] 6. Implement filter-based selection clearing





  - Add watchers for filter changes (status, type, episode, assignee, context, search)
  - Clear `rowSelection` state when any filter changes
  - _Requirements: 1.5_

- [ ]* 6.1 Write property test for filter clears selection
  - **Property 2: Filter clears selection**
  - **Validates: Requirements 1.5**

- [x] 7. Create TaskBulkActionsMenu component





  - Create new component at `frontend/src/components/task/TaskBulkActionsMenu.vue`
  - Use DropdownMenu from shadcn-vue for base structure
  - Implement absolute positioning based on cursor coordinates
  - Add viewport boundary detection for menu positioning
  - Create "Set Status" menu item with status submenu
  - Create "Assign To" menu item with user list submenu
  - Emit events for status-selected and assignee-selected
  - _Requirements: 3.1, 3.3, 4.1, 5.1, 5.2_

- [x] 8. Implement context menu trigger in TaskBrowser





  - Add `@contextmenu` event handler to table rows
  - Implement `handleContextMenu` method to position and show menu
  - Ensure right-clicked unselected row gets selected before menu shows
  - Add click-outside handler to close context menu
  - Prevent context menu on empty table areas
  - _Requirements: 3.1, 3.2, 3.3, 3.4_

- [ ]* 8.1 Write property test for context menu task inclusion
  - **Property 3: Context menu task inclusion**
  - **Validates: Requirements 3.2**

- [x] 9. Implement bulk status update action





  - Create `handleBulkStatusUpdate` method in TaskBrowser
  - Extract selected task IDs from selection state
  - Call `taskService.bulkUpdateStatus` with task IDs and new status
  - Show loading state during operation
  - Display success toast with count of updated tasks
  - Handle errors and display error toast
  - Refresh task list after successful update
  - Close context menu and clear selection after completion
  - _Requirements: 4.2, 4.3, 4.4, 4.5, 6.1, 6.3_

- [x] 10. Implement bulk assignment action





  - Create `handleBulkAssignment` method in TaskBrowser
  - Extract selected task IDs from selection state
  - Call `taskService.bulkAssignTasks` with task IDs and user ID
  - Show loading state during operation
  - Display success toast with count of assigned tasks
  - Handle errors and display error toast
  - Refresh task list after successful update
  - Close context menu and clear selection after completion
  - _Requirements: 5.3, 5.4, 5.5, 5.6, 6.1, 6.3_

- [ ] 11. Implement keyboard shortcuts
  - Add `@keydown` event handler to table container
  - Implement Ctrl+A (Cmd+A on Mac) to select all visible tasks
  - Implement Escape to clear selection and close context menu
  - Implement Ctrl+Click (Cmd+Click on Mac) for toggle selection
  - Implement Shift+Click for range selection
  - Track `lastSelectedIndex` for range selection
  - _Requirements: 7.1, 7.2, 7.3, 7.4_

- [ ]* 11.1 Write property test for Ctrl+A selection
  - **Property 6: Keyboard shortcut selection**
  - **Validates: Requirements 7.1**

- [ ]* 11.2 Write property test for Shift-click range selection
  - **Property 7: Shift-click range selection**
  - **Validates: Requirements 7.4**

- [ ] 12. Add loading and disabled states
  - Add `isProcessingBulkAction` state flag
  - Disable context menu options during bulk operations
  - Show loading spinner or disabled state in menu
  - Prevent duplicate operations while processing
  - _Requirements: 6.2_

- [ ]* 13. Write unit tests for edge cases
  - Test empty selection state handling
  - Test single task selection
  - Test select all with no tasks
  - Test context menu positioning at viewport edges
  - Test keyboard event handling with various modifier keys

- [ ] 14. Final checkpoint - Ensure all tests pass
  - Ensure all tests pass, ask the user if questions arise.
