docs(quick-16): complete Ctrl+A select-all hotkey implementation
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user