docs(quick-16): complete Ctrl+A select-all hotkey implementation

This commit is contained in:
2026-03-07 10:20:16 -05:00
parent 906ea28751
commit 043c74c8b3
@@ -0,0 +1,72 @@
---
phase: quick-16
plan: 01
subsystem: frontend/keyboard-shortcuts
tags: [shortcuts, selection, ctrl-a, multi-select]
dependency_graph:
requires: [selection-controller, keyboard-shortcut-service]
provides: [select-all-shortcut]
affects: [track-list, queue-panel, playlist-view]
tech_stack:
added: []
patterns: [CustomEvent broadcast for panel-agnostic shortcuts]
key_files:
created: []
modified:
- frontend/src/utils/selection-controller.ts
- frontend/src/services/keyboard-shortcut-service.ts
- frontend/src/components/track-list/track-list.ts
- frontend/src/components/queue-panel/queue-panel.ts
- frontend/src/components/playlist-view/playlist-view.ts
decisions:
- Broadcast shortcut:select-all to all connected components rather than routing to focused panel — harmless no-op on empty/inactive panels, consistent with existing tracklist.play pattern
metrics:
duration: 2 min
completed: "2026-03-07"
---
# Quick Task 16: Add Ctrl+A Hotkey to Multi-Select Views
SelectionController.selectAll() method with shortcut:select-all CustomEvent broadcast to track-list, queue-panel, and playlist-view
## What Changed
### Task 1: Add selectAll() to SelectionController and change app.selectAll dispatch
**Commit:** `f567762`
- Added `selectAll()` method to `SelectionController` that iterates all host items via `getItemCount()`/`getItemKey()` and builds a complete selection set
- Includes early-return guard when all items are already selected (prevents redundant updates)
- Sets `lastSelectedIndex` to the last item for consistent shift-click behavior after select-all
- Changed `app.selectAll` dispatch from `document.execCommand('selectAll')` (browser text selection) to `document.dispatchEvent(new CustomEvent('shortcut:select-all'))` following the existing shortcut event pattern
### Task 2: Wire select-all event listener in track-list, queue-panel, and playlist-view
**Commit:** `906ea28`
- Added `handleSelectAll` arrow method to all three components calling `this.selection.selectAll()`
- Registered `shortcut:select-all` event listener in `connectedCallback()` and cleaned up in `disconnectedCallback()` for all three components
- All three components may respond simultaneously but this is harmless — empty/inactive panels have 0 items and the selectAll early-return guard triggers immediately
## Deviations from Plan
None — plan executed exactly as written.
## Verification Results
| Check | Result |
|-------|--------|
| TypeScript compilation (`tsc --noEmit`) | Pass |
| Lint (`make lint`) | Pass (0 issues) |
| Pre-commit hooks | Pass (frontend-typecheck) |
## Commits
| Task | Commit | Description |
|------|--------|-------------|
| 1 | `f567762` | Add selectAll() to SelectionController and dispatch shortcut:select-all event |
| 2 | `906ea28` | Wire shortcut:select-all listener in track-list, queue-panel, and playlist-view |
## Self-Check: PASSED
- All 5 modified files exist on disk
- Both commits (f567762, 906ea28) verified in git log
- SUMMARY.md created at expected path