diff --git a/changelog.json b/changelog.json index 7585532..53c5b05 100644 --- a/changelog.json +++ b/changelog.json @@ -8,7 +8,8 @@ "A reference you assign by hand now replaces what the matcher found instead of being added to it, so a correction survives the next recompute.", "Awards: an award can be marked one reference per QSO. When several references then match the same contact it keeps none and lists them, so you pick — a contact does not silently get the wrong DOK. Off by default, so an n-fer POTA activation still counts every park.", "Dark themes: the calendar icon of date and date-time fields is visible again.", - "Live award detection now sees the QTH, name, country, comment, note and grid you typed, not just the looked-up address — an award matching on the town stayed silent until the QSO was logged." + "Live award detection now sees the QTH, name, country, comment, note and grid you typed, not just the looked-up address — an award matching on the town stayed silent until the QSO was logged.", + "Info (F2) panel: the fields are sized for what they hold — a wider county, narrower prefix and zones, and the address takes the space left by the bearing and distances." ], "fr": [ "Le CAT série ne met plus la radio en émission par le seul fait de se connecter : DTR et RTS sont abaissés sur Xiegu, Yaesu et Kenwood comme ils l'étaient déjà sur Icom — un Xiegu G90 derrière un DE-19 partait en émission et y restait.", @@ -16,7 +17,8 @@ "Une référence que vous affectez à la main remplace désormais ce que la détection avait trouvé au lieu de s'y ajouter : une correction survit au recalcul suivant.", "Diplômes : un diplôme peut être marqué une seule référence par QSO. Si plusieurs références correspondent alors au même contact, aucune n’est retenue et elles sont listées pour que vous choisissiez — un contact ne reçoit plus silencieusement le mauvais DOK. Désactivé par défaut, donc une activation POTA n-fer compte toujours tous les parcs.", "Thèmes sombres : l’icône calendrier des champs date et date-heure est de nouveau visible.", - "La détection des diplômes en direct voit maintenant le QTH, le nom, le pays, le commentaire, la note et le locator saisis, et plus seulement l’adresse issue de la recherche — un diplôme qui matche sur la ville restait muet jusqu’à l’enregistrement du QSO." + "La détection des diplômes en direct voit maintenant le QTH, le nom, le pays, le commentaire, la note et le locator saisis, et plus seulement l’adresse issue de la recherche — un diplôme qui matche sur la ville restait muet jusqu’à l’enregistrement du QSO.", + "Panneau Info (F2) : les champs sont dimensionnés selon leur contenu — comté plus large, préfixe et zones plus étroits, et l’adresse récupère la place laissée par l’azimut et les distances." ] }, { diff --git a/frontend/src/components/DetailsPanel.tsx b/frontend/src/components/DetailsPanel.tsx index 96603b2..3bc547e 100644 --- a/frontend/src/components/DetailsPanel.tsx +++ b/frontend/src/components/DetailsPanel.tsx @@ -122,9 +122,17 @@ function numOrUndef(v: string): number | undefined { } // Compact field helper to keep the JSX dense. -function Field({ label, span = 1, children }: { label: string; span?: 1 | 2 | 3 | 4 | 6; children: React.ReactNode }) { +// Written out rather than built as `col-span-${n}`: Tailwind scans for literal +// class names, so an interpolated one is never emitted. +const SPAN_CLASS: Record = { + 1: '', 2: 'col-span-2', 3: 'col-span-3', 4: 'col-span-4', 5: 'col-span-5', + 6: 'col-span-6', 7: 'col-span-7', 8: 'col-span-8', 9: 'col-span-9', + 10: 'col-span-10', 11: 'col-span-11', 12: 'col-span-12', +}; + +function Field({ label, span = 1, className, children }: { label: string; span?: number; className?: string; children: React.ReactNode }) { return ( -
+
{children}
@@ -243,14 +251,18 @@ export function DetailsPanel({ callsign, prefix, operatorGrid, remoteGrid, qth, )} {open === 'info' && ( -
- +
+ {/* Twelve columns, not six: the fields hold very different things. A US + county name is long, a CQ zone is two digits — on an even six-column + grid they were the same width, so the county truncated while the + zones sat mostly empty. */} + onChange({ state: e.target.value })} /> - + onChange({ cnty: e.target.value })} /> - + @@ -264,7 +276,7 @@ export function DetailsPanel({ callsign, prefix, operatorGrid, remoteGrid, qth, {/* DXCC # closes the top row (next to the zones); Continent and Azimuth SP live in the main entry strip / bandeau. The long-path bearing and distances move to the row below. */} - + - - - - - - - - - - - onChange({ address: e.target.value })} /> - - + {/* The bearing and the two distances are read-only and hold at most + "12345 km", so they take a fixed width and the address — the one + field here that is never wide enough — gets everything left over. */} +
+ + + + + + + + + + + onChange({ address: e.target.value })} /> + +
+ onChange({ qsl_msg: e.target.value })} /> - + onChange({ qsl_via: e.target.value })} />
diff --git a/internal/award/catalog/dld.json b/internal/award/catalog/dld.json index b4f5667..0582984 100644 --- a/internal/award/catalog/dld.json +++ b/internal/award/catalog/dld.json @@ -12,11 +12,14 @@ "type": "QSOFIELDS", "field": "address", "match_by": "description", + "exact_match": true, "pattern": "", + "one_ref_per_qso": true, "or_rules": [ { "field": "qth", - "match_by": "description" + "match_by": "description", + "exact_match": true } ], "dxcc_filter": [ @@ -34,7 +37,7 @@ ], "total": 0, "builtin": true, - "version": 1 + "version": 2 }, "references": [ {