feat(lookup): optional QRZ nickname as the logged name

QRZ publishes <nickname> — the name an operator goes BY on the air — and
OpsLog was composing fname + name instead. "Bob" is what belongs in a log;
"Robert J Smith" is what belongs on a licence.

QRZ only, and deliberately so: HamQTH's <nick> already fills the Name field
that way, so the same switch there would toggle a behaviour it has no way to
turn off.

A published nickname is optional, so an empty one falls through to the
registered name. That is the whole point of it being a fallback rather than a
swap, and it is what the test pins — a blank nickname must never blank the
name.
This commit is contained in:
2026-08-13 10:49:52 +02:00
parent b2382a6135
commit 8e49d37cbd
9 changed files with 140 additions and 57 deletions
+18
View File
@@ -1224,6 +1224,7 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
hamqth_user: '', hamqth_password: '',
primary: '', failsafe: '',
download_images: false,
qrz_prefer_nickname: false,
cache_ttl_days: 30,
});
// Per-provider Test state — keeps the success/error feedback adjacent
@@ -2312,6 +2313,23 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
</span>
</span>
</label>
{/* QRZ only. HamQTH's <nick> already fills the Name field with the
on-air name, so the same switch there would toggle a behaviour it
has no way to turn off. */}
<label className="flex items-start gap-2 text-sm cursor-pointer mt-3">
<Checkbox
checked={!!(lookup as any).qrz_prefer_nickname}
onCheckedChange={(c) => setLookup((s) => ({ ...s, qrz_prefer_nickname: !!c } as any))}
className="mt-0.5"
/>
<span>
{t('lk.qrzNickname')}
<span className="block text-xs text-muted-foreground mt-0.5">
{t('lk.qrzNicknameHint')}
</span>
</span>
</label>
</div>
<div className="mt-6 pt-4 border-t border-border">