feat: add award detail view with QSO count per slot and mode filter

- Award detail page now shows QSO counts per (entity, band, mode) slot
- Click count to open modal with all QSOs for that slot
- Click QSO in list to view full details
- Add mode filter: "Mixed Mode" aggregates by band, specific modes show (band, mode) columns
- Backend groups by slot and collects all confirmed QSOs in qsos array
- Frontend displays clickable count links (removed blue bubbles)

Backend changes:
- calculateDOKAwardProgress(): groups by (DOK, band, mode), collects qsos array
- calculatePointsAwardProgress(): updated for all count modes with qsos array
- getAwardEntityBreakdown(): groups by (entity, band, mode) slots

Frontend changes:
- Add mode filter dropdown with "Mixed Mode" default
- Update grouping logic to handle mixed mode vs specific mode
- Replace count badges with simple clickable links
- Add QSO list modal showing all QSOs per slot
- Add Mode column to QSO list (useful in mixed mode)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-01-22 07:34:55 +01:00
parent 695000e35c
commit dd3beef9af
3 changed files with 507 additions and 111 deletions

View File

@@ -754,3 +754,53 @@ AND (dclQslRstatus IS NULL OR dclQslRstatus != 'Y')
- Tracks updated QSOs (restores previous state)
- Only allows canceling failed jobs or stale running jobs (>1 hour)
- Server-side validation prevents unauthorized cancellations
### Award Detail View (January 2025)
**Overview**: The award detail page (`src/frontend/src/routes/awards/[id]/+page.svelte`) displays award progress in a pivot table format with entities as rows and band/mode combinations as columns.
**Key Features**:
- **QSO Count per Slot**: Each table cell shows the count of confirmed QSOs for that (entity, band, mode) combination
- **Drill-Down**: Click a count to open a modal showing all QSOs for that slot
- **QSO Detail**: Click any QSO in the list to view full QSO details
- **Mode Filter**: Filter by specific mode or view "Mixed Mode" (aggregates all modes by band)
**Backend Changes** (`src/backend/services/awards.service.js`):
- `calculateDOKAwardProgress()`: Groups by (DOK, band, mode) slots, collects all confirmed QSOs in `qsos` array
- `calculatePointsAwardProgress()`: Updated for all count modes (perBandMode, perStation, perQso) with `qsos` array
- `getAwardEntityBreakdown()`: Groups by (entity, band, mode) slots for entity awards
**Response Structure**:
```javascript
{
entity: "F03",
band: "80m",
mode: "CW",
worked: true,
confirmed: true,
qsos: [
{ qsoId: 123, callsign: "DK0MU", mode: "CW", qsoDate: "20250115", timeOn: "123456", confirmed: true },
{ qsoId: 456, callsign: "DL1ABC", mode: "CW", qsoDate: "20250120", timeOn: "234500", confirmed: true }
]
}
```
**Mode Filter**:
- **Mixed Mode (default)**: Shows bands as columns, aggregates all modes
- Example: Columns are "80m", "40m", "20m"
- Clicking a count shows all QSOs for that band across all modes
- **Specific Mode**: Shows (band, mode) combinations as columns
- Example: Columns are "80m CW", "80m SSB", "40m CW"
- Filters to only show QSOs with that mode
**Frontend Components**:
- **Mode Filter Dropdown**: Located between summary cards and table
- Dynamically populated with available modes from the data
- Clear button appears when specific mode is selected
- **Count Badges**: Blue clickable links showing QSO count (removed bubbles, kept links)
- **QSO List Modal**: Shows all QSOs for selected slot with columns: Callsign, Date, Time, Mode
- **QSO Detail Modal**: Full QSO information (existing feature)
**Files Modified**:
- `src/backend/services/awards.service.js` - Backend grouping and QSO collection
- `src/frontend/src/routes/awards/[id]/+page.svelte` - Frontend display and interaction