feat: materialize award references into the QSO row (award_refs column)

Award refs are now computed once and stored on the QSO as a JSON column
(award_refs, e.g. {"DDFM":"74","WAJA":"12"}) instead of recomputing the whole
award engine on every grid page load. Written on log/edit/UDP-import and
bulk-recomputed when an award definition or reference list changes; a one-time
per-logbook backfill materializes pre-existing QSOs. The grid reads the column
directly like any other field, so it's fast and available everywhere (including
the shared MySQL logbook).

Also fix per-profile grid column layout: the DB copy was already per-profile,
but the localStorage cache used one global namespace and shadowed it, so a
profile switch kept the previous profile's columns/widths. gridPrefs now scopes
the cache by active profile id and the grids remount on profile:changed.
This commit is contained in:
2026-07-20 11:51:49 +02:00
parent 9cc72c7575
commit 64b746f007
9 changed files with 396 additions and 87 deletions
+2
View File
@@ -666,6 +666,8 @@ export function QSOAudioRestart():Promise<boolean>;
export function QuitApp():Promise<void>;
export function RecomputeAllAwardRefs():Promise<number>;
export function RefreshCtyDat():Promise<main.CtyDatInfo>;
export function RefreshSolar():Promise<void>;
+4
View File
@@ -1290,6 +1290,10 @@ export function QuitApp() {
return window['go']['main']['App']['QuitApp']();
}
export function RecomputeAllAwardRefs() {
return window['go']['main']['App']['RecomputeAllAwardRefs']();
}
export function RefreshCtyDat() {
return window['go']['main']['App']['RefreshCtyDat']();
}
+2
View File
@@ -3648,6 +3648,7 @@ export namespace qso {
my_arrl_sect?: string;
my_vucc_grids?: string;
extras?: Record<string, string>;
award_refs?: string;
// Go type: time
created_at: any;
// Go type: time
@@ -3785,6 +3786,7 @@ export namespace qso {
this.my_arrl_sect = source["my_arrl_sect"];
this.my_vucc_grids = source["my_vucc_grids"];
this.extras = source["extras"];
this.award_refs = source["award_refs"];
this.created_at = this.convertValues(source["created_at"], null);
this.updated_at = this.convertValues(source["updated_at"], null);
}