chore: release v0.26.0
This commit is contained in:
@@ -69,6 +69,7 @@ export type SpotStatusEntry = {
|
||||
spotter_continent?: string;
|
||||
grid?: string;
|
||||
new_grid?: boolean;
|
||||
grid_state?: string;
|
||||
};
|
||||
|
||||
type Props = {
|
||||
@@ -266,12 +267,12 @@ const makeColCatalog = (t: TFn): ColEntry[] => [
|
||||
if (s?.new_county) parts.push(t('clg2.newCounty'));
|
||||
if (s?.new_pota) parts.push(t('clg2.newPota'));
|
||||
if (s?.new_pfx) parts.push(t('clg2.newPfx'));
|
||||
if (s?.new_grid) parts.push(t('clg2.newGrid'));
|
||||
if (s?.new_grid) parts.push(s.grid_state === 'unconf' ? t('clg2.newGridUnconf') : t('clg2.newGrid'));
|
||||
return parts.join(' ');
|
||||
},
|
||||
cellRenderer: (p: any) => {
|
||||
const s = statusFor(p);
|
||||
const parts: { text: string; color: string }[] = [];
|
||||
const parts: { text: string; color: string; dim?: boolean }[] = [];
|
||||
const main = statusColor(s);
|
||||
if (main) {
|
||||
const label = s?.status === 'new' ? t('clg2.newDxcc')
|
||||
@@ -287,12 +288,19 @@ const makeColCatalog = (t: TFn): ColEntry[] => [
|
||||
if (s?.new_county) parts.push({ text: t('clg2.newCounty'), color: markerColour('new_county') });
|
||||
if (s?.new_pota) parts.push({ text: t('clg2.newPota'), color: markerColour('new_pota') });
|
||||
if (s?.new_pfx) parts.push({ text: t('clg2.newPfx'), color: markerColour('new_pfx') });
|
||||
if (s?.new_grid) parts.push({ text: t('clg2.newGrid'), color: markerColour('new_grid') });
|
||||
// Worked-but-unconfirmed is a QSL to chase, not a QSO to make. Same hue
|
||||
// held back, so it reads as "less" of the same thing rather than a
|
||||
// different fact — and the label says which.
|
||||
if (s?.new_grid) {
|
||||
parts.push(s.grid_state === 'unconf'
|
||||
? { text: t('clg2.newGridUnconf'), color: markerColour('new_grid'), dim: true }
|
||||
: { text: t('clg2.newGrid'), color: markerColour('new_grid') });
|
||||
}
|
||||
if (parts.length === 0) return <span style={{ color: 'var(--muted-foreground)', fontSize: 10 }}>—</span>;
|
||||
return (
|
||||
<span style={{ whiteSpace: 'nowrap' }}>
|
||||
{parts.map((pt, i) => (
|
||||
<span key={i} style={{ color: pt.color, fontWeight: 700 }}>
|
||||
<span key={i} style={{ color: pt.color, fontWeight: 700, opacity: pt.dim ? 0.5 : 1 }}>
|
||||
{i > 0 ? ' · ' : ''}{pt.text}
|
||||
</span>
|
||||
))}
|
||||
@@ -638,6 +646,17 @@ export function ClusterGrid({ rows, spotStatus, onSpotClick }: Props) {
|
||||
{t('clg2.pickerDesc')}
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
{/* Whole-dialog controls. showAll/hideAll with no group already mean
|
||||
"every column"; only the buttons were missing, so hiding the lot
|
||||
took one click per group. */}
|
||||
<div className="flex items-center gap-1 px-1 text-[11px] text-muted-foreground">
|
||||
<span>{t('clg2.allGroups')}</span>
|
||||
<button type="button" className="text-[11px] text-primary hover:underline px-1"
|
||||
onClick={() => showAll()}>{t('clg2.all')}</button>
|
||||
<span className="opacity-40">·</span>
|
||||
<button type="button" className="text-[11px] text-muted-foreground hover:underline px-1"
|
||||
onClick={() => hideAll()}>{t('clg2.none')}</button>
|
||||
</div>
|
||||
<div className="max-h-[60vh] overflow-y-auto py-2">
|
||||
{GROUP_ORDER.map((group) => {
|
||||
const cols = COL_CATALOG.filter((c) => c.group === group);
|
||||
|
||||
Reference in New Issue
Block a user