feat: filter award references by mode class

All / CW / Phone / Digital, stacked on top of the worked/confirmed filter. The
question an operator actually has — which DXCC entities have I worked on CW but
not confirmed on CW — needs both at once; answering only one of them is what
sends people to a spreadsheet.

References carried bands but not modes, so the award computation now aggregates
mode CLASSES per reference, worked and confirmed separately. Classes, not ADIF
modes: nobody chasing CW cares whether the digital side was FT8 or RTTY, and a
list of twenty mode names would not answer the question. An unrecognised mode
counts as data rather than as nothing, so a new digital mode does not vanish
from the filter the day it appears.

Two rules the filter needs to be honest:

  - Not-confirmed means not confirmed ON THIS MODE. An entity worked on CW and
    confirmed on SSB is still a CW entity to chase, and that is exactly what the
    filter is for.
  - "Not worked" plus a mode is a contradiction — an unworked reference has no
    mode — so the mode filter stands aside there instead of emptying the list.
This commit is contained in:
2026-07-31 16:09:11 +02:00
parent d90f953df4
commit 3e22c4d1a3
6 changed files with 111 additions and 13 deletions
+4
View File
@@ -506,6 +506,8 @@ export namespace award {
worked: boolean;
confirmed: boolean;
validated: boolean;
modes: string[];
confirmed_modes: string[];
bands: string[];
confirmed_bands: string[];
validated_bands: string[];
@@ -523,6 +525,8 @@ export namespace award {
this.worked = source["worked"];
this.confirmed = source["confirmed"];
this.validated = source["validated"];
this.modes = source["modes"];
this.confirmed_modes = source["confirmed_modes"];
this.bands = source["bands"];
this.confirmed_bands = source["confirmed_bands"];
this.validated_bands = source["validated_bands"];