fix(chase): each unconfirmed badge keeps its own name; the block moves up
The unconf label was hard-coded to GRID? for every category — a prefix worked-but-unconfirmed showed as a second grid badge beside the real one, which read as impossible. Each badge now says its own name plus a question mark. And the global Chase block moves above the Chase POTA/SOTA/grid checkboxes, where its operator expected the master switch.
This commit is contained in:
@@ -1168,12 +1168,12 @@ export function DecodesPanel({ decodes, txMsgs, txState, txStates, spotStatus, o
|
|||||||
const c = markerColour(b.marker);
|
const c = markerColour(b.marker);
|
||||||
return (
|
return (
|
||||||
<span key={b.key as string}
|
<span key={b.key as string}
|
||||||
title={unconf ? t('dec.bgGridUnconfTip') : undefined}
|
title={unconf ? t('dec.unconfTip') : undefined}
|
||||||
className="rounded border px-1 py-px text-[10px] font-semibold uppercase tracking-wide bg-transparent shrink-0"
|
className="rounded border px-1 py-px text-[10px] font-semibold uppercase tracking-wide bg-transparent shrink-0"
|
||||||
style={unconf
|
style={unconf
|
||||||
? { borderColor: c, color: c, opacity: 0.45, borderStyle: 'dashed' }
|
? { borderColor: c, color: c, opacity: 0.45, borderStyle: 'dashed' }
|
||||||
: { borderColor: c, color: c }}>
|
: { borderColor: c, color: c }}>
|
||||||
{unconf ? t('dec.bgGridUnconf') : t(b.label)}
|
{unconf ? t(b.label) + '?' : t(b.label)}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -5423,6 +5423,38 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
|||||||
{/* Chase switches: off, the marker stops being TOLD, everywhere at
|
{/* Chase switches: off, the marker stops being TOLD, everywhere at
|
||||||
once — badge, colour, filter chip, reference column. A "new band
|
once — badge, colour, filter chip, reference column. A "new band
|
||||||
+ new POTA" spot then reads NEW BAND alone. */}
|
+ new POTA" spot then reads NEW BAND alone. */}
|
||||||
|
{/* The GLOBAL hunt: every category (DXCC, band, mode, slot, prefix,
|
||||||
|
county, state, grid) judged as new-only or new-plus-unconfirmed,
|
||||||
|
against the confirmation sources the operator trusts. */}
|
||||||
|
<div className="rounded-lg border border-border p-3 space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="text-xs text-muted-foreground w-28 shrink-0">{t('chg.mode')}</span>
|
||||||
|
<Select value={chaseCfg.mode} onValueChange={(v) => { const next = { ...chaseCfg, mode: v }; setChaseCfg(next); void SaveChaseSettings(next as any); }}>
|
||||||
|
<SelectTrigger className="h-7 w-64 text-xs"><SelectValue /></SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value="new">{t('gsc.huntNew')}</SelectItem>
|
||||||
|
<SelectItem value="new_unconfirmed">{t('gsc.huntUnconf')}</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
{chaseCfg.mode === 'new_unconfirmed' && (
|
||||||
|
<div className="flex items-center gap-4 flex-wrap pl-2">
|
||||||
|
<span className="text-xs text-muted-foreground">{t('chg.sources')}</span>
|
||||||
|
{([['lotw', 'LoTW'], ['card', t('chg.card')], ['eqsl', 'eQSL'], ['qrz', 'QRZ.com']] as const).map(([k, label]) => (
|
||||||
|
<label key={k} className="flex items-center gap-1.5 text-xs cursor-pointer">
|
||||||
|
<Checkbox checked={chaseCfg.sources.includes(k)}
|
||||||
|
onCheckedChange={(c) => {
|
||||||
|
const sources = c ? [...chaseCfg.sources, k] : chaseCfg.sources.filter((x) => x !== k);
|
||||||
|
const next = { ...chaseCfg, sources };
|
||||||
|
setChaseCfg(next); void SaveChaseSettings(next as any);
|
||||||
|
}} />
|
||||||
|
{label}
|
||||||
|
</label>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
<label className="flex items-center gap-2 text-sm cursor-pointer" title={t('clu.chasePotaHint')}>
|
<label className="flex items-center gap-2 text-sm cursor-pointer" title={t('clu.chasePotaHint')}>
|
||||||
<Checkbox checked={chasePotaOn}
|
<Checkbox checked={chasePotaOn}
|
||||||
onCheckedChange={(c) => { const v = !!c; setChasePotaOn(v); writeUiPref('opslog.chasePota', v ? '1' : '0'); }} />
|
onCheckedChange={(c) => { const v = !!c; setChasePotaOn(v); writeUiPref('opslog.chasePota', v ? '1' : '0'); }} />
|
||||||
@@ -5466,37 +5498,6 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* The GLOBAL hunt: every category (DXCC, band, mode, slot, prefix,
|
|
||||||
county, state, grid) judged as new-only or new-plus-unconfirmed,
|
|
||||||
against the confirmation sources the operator trusts. */}
|
|
||||||
<div className="rounded-lg border border-border p-3 space-y-2">
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<span className="text-xs text-muted-foreground w-28 shrink-0">{t('chg.mode')}</span>
|
|
||||||
<Select value={chaseCfg.mode} onValueChange={(v) => { const next = { ...chaseCfg, mode: v }; setChaseCfg(next); void SaveChaseSettings(next as any); }}>
|
|
||||||
<SelectTrigger className="h-7 w-64 text-xs"><SelectValue /></SelectTrigger>
|
|
||||||
<SelectContent>
|
|
||||||
<SelectItem value="new">{t('gsc.huntNew')}</SelectItem>
|
|
||||||
<SelectItem value="new_unconfirmed">{t('gsc.huntUnconf')}</SelectItem>
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
{chaseCfg.mode === 'new_unconfirmed' && (
|
|
||||||
<div className="flex items-center gap-4 flex-wrap pl-2">
|
|
||||||
<span className="text-xs text-muted-foreground">{t('chg.sources')}</span>
|
|
||||||
{([['lotw', 'LoTW'], ['card', t('chg.card')], ['eqsl', 'eQSL'], ['qrz', 'QRZ.com']] as const).map(([k, label]) => (
|
|
||||||
<label key={k} className="flex items-center gap-1.5 text-xs cursor-pointer">
|
|
||||||
<Checkbox checked={chaseCfg.sources.includes(k)}
|
|
||||||
onCheckedChange={(c) => {
|
|
||||||
const sources = c ? [...chaseCfg.sources, k] : chaseCfg.sources.filter((x) => x !== k);
|
|
||||||
const next = { ...chaseCfg, sources };
|
|
||||||
setChaseCfg(next); void SaveChaseSettings(next as any);
|
|
||||||
}} />
|
|
||||||
{label}
|
|
||||||
</label>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Chase new — its own option, NOT nested under grid chasing. Chasing
|
{/* Chase new — its own option, NOT nested under grid chasing. Chasing
|
||||||
squares and chasing entities are different wants; they only share
|
squares and chasing entities are different wants; they only share
|
||||||
|
|||||||
Reference in New Issue
Block a user