chore: release v0.26.0

This commit is contained in:
2026-08-20 17:53:55 +02:00
parent 47992b5f03
commit 1e507225dd
44 changed files with 3197 additions and 240 deletions
+30 -2
View File
@@ -631,6 +631,20 @@ export function RecentQSOsGrid({ rows, myGrid, selectAllSignal, selectRowSignal,
api.setColumnsVisible(ids, false);
saveColumnState();
}
// Whole-dialog show/hide. showAll/hideAll cover the CATALOGUE only; the award
// columns live in their own persisted code set, so a global that skipped them
// would leave a row of columns behind and look broken.
function setEverything(visible: boolean) {
const api = gridRef.current?.api;
if (!api) return;
api.setColumnsVisible(COL_CATALOG.map((c) => c.colId!), visible);
if (awardCols && awardCols.length > 0) {
persistAwardShown(visible ? new Set(awardCols.map((a) => a.code.toUpperCase())) : new Set());
api.setColumnsVisible(awardCols.map((a) => `award_${a.code}`), visible);
}
saveColumnState();
}
function resetDefaults() {
const api = gridRef.current?.api;
if (!api) return;
@@ -711,11 +725,15 @@ export function RecentQSOsGrid({ rows, myGrid, selectAllSignal, selectRowSignal,
</div>
</div>
{/* Every handler is passed STRAIGHT through, never wrapped in an arrow: a
wrapper is always truthy, so the menu drew "Fix country" and "Update
from the callsign databases" even in a grid that wired neither — and
clicking them did nothing at all. */}
<QSOContextMenu
menu={menu}
onClose={() => setMenu(null)}
onUpdateFromCty={(ids) => onUpdateFromCty?.(ids)}
onUpdateFromQRZ={(ids) => onUpdateFromQRZ?.(ids)}
onUpdateFromCty={onUpdateFromCty}
onUpdateFromQRZ={onUpdateFromQRZ}
onUpdateFromClublog={onUpdateFromClublog}
onUpdateCountyFromULS={onUpdateCountyFromULS}
onSendTo={onSendTo}
@@ -738,6 +756,16 @@ export function RecentQSOsGrid({ rows, myGrid, selectAllSignal, selectRowSignal,
{t('rqg.pickerDesc')}
</DialogDescription>
</DialogHeader>
{/* Whole-dialog controls. The per-group links alone meant hiding
everything was one click PER GROUP, and there are a dozen. */}
<div className="flex items-center gap-1 px-5 text-[11px] text-muted-foreground">
<span>{t('rqg.pickerAllGroups')}</span>
<button type="button" className="text-[11px] text-primary hover:underline px-1"
onClick={() => setEverything(true)}>{t('rqg.all')}</button>
<span className="opacity-40">·</span>
<button type="button" className="text-[11px] text-muted-foreground hover:underline px-1"
onClick={() => setEverything(false)}>{t('rqg.none')}</button>
</div>
<div className="grid grid-cols-3 gap-4 max-h-[60vh] overflow-y-auto px-5 py-3">
{GROUP_ORDER.map((group) => {
const cols = COL_CATALOG.filter((c) => c.group === group);