diff --git a/changelog.json b/changelog.json index 7b4927f..11a1fbd 100644 --- a/changelog.json +++ b/changelog.json @@ -6,13 +6,13 @@ "Cluster: \"Hide worked\" no longer hides a spot that is a new prefix, county, grid or park in an entity already worked.", "DX Cluster: a spot lifetime can be set — 5, 10, 15 minutes or your own value — after which spots leave the list and the band maps.", "Call lookup: QRZ.com now fills Name with the first name only, and optionally with the operator nickname instead.", - "Entry form: Name, Band, Mode and Country are narrower, and a State field sits between QTH and the locator." + "Entry form: a narrower left column, State beside the locator, and a new line with County, CQ, ITU and DXCC." ], "fr": [ "Cluster : « Masquer les contactés » ne masque plus un spot qui est un nouveau préfixe, comté, carré ou parc dans une contrée déjà faite.", "Cluster DX : on peut fixer une durée de vie des spots — 5, 10, 15 minutes ou une valeur libre — au-delà de laquelle ils quittent la liste et les band maps.", "Recherche d indicatif : QRZ.com remplit désormais Nom avec le seul prénom, et au choix avec le surnom de l opérateur.", - "Saisie : Nom, Bande, Mode et Pays sont plus étroits, et un champ État s intercale entre QTH et le locator." + "Saisie : colonne de gauche plus étroite, État à côté du locator, et une nouvelle ligne Comté, CQ, ITU et DXCC." ] }, { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 46558f5..d919b50 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -4448,6 +4448,41 @@ export default function App() { onChange={(e) => setDetails((d) => ({ ...d, state: e.target.value.toUpperCase() }))} /> ); + // County beside State: the lookup fills QTH, State, County and the locator + // together, and they are read together. Wider than State because a county name + // is a name — "St. Tammany Parish", not a code. + // The row Comment/Note freed by moving onto one line: county, zones and the + // ADIF entity number. All four are filled by the lookup and were previously + // only visible after opening a tab — which is the wrong place for values an + // operator wants to SEE are right before pressing Log. + // + // A numeric field stores undefined when cleared, not 0: zero is a real DXCC + // number for "no entity" and a real answer for a zone, so an empty box must + // stay empty rather than assert something. + const num = (v: string): number | undefined => { + const s = v.replace(/[^0-9]/g, ''); + return s === '' ? undefined : parseInt(s, 10); + }; + const geoDetailRow = ( +
+
+ setDetails((d) => ({ ...d, cnty: e.target.value }))} /> +
+
+ setDetails((d) => ({ ...d, cqz: num(e.target.value) }))} /> +
+
+ setDetails((d) => ({ ...d, ituz: num(e.target.value) }))} /> +
+
+ setDetails((d) => ({ ...d, dxcc: num(e.target.value) }))} /> +
+
+ ); const gridBlock = (
{ setGrid(e.target.value); markEdited('grid'); }} /> @@ -5913,9 +5948,12 @@ export default function App() { {modeRow} {countryRow}
-
-
{commentLine}
-
{noteLine}
+
+
+
{commentLine}
+
{noteLine}
+
+ {geoDetailRow}
diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index 27054c8..a466611 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -54,7 +54,7 @@ const en: Dict = { 'tab.main': 'Main', 'main.splitTip': 'Drag to resize the panes — double-click to even them out', 'tab.recent': 'Recent QSOs', 'tab.cluster': 'Cluster', 'tab.worked': 'Worked before', 'tab.awards': 'Awards', 'tab.bandmap': 'Band Map', 'tab.contest': 'Contest', 'tab.net': 'Net', // Entry form - 'field.callsign': 'Callsign', 'field.name': 'Name', 'field.qth': 'QTH', 'field.state': 'State', 'field.grid': 'Grid', + 'field.callsign': 'Callsign', 'field.name': 'Name', 'field.qth': 'QTH', 'field.state': 'State', 'field.cnty': 'County', 'field.cqz': 'CQ', 'field.ituz': 'ITU', 'field.dxcc': 'DXCC', 'field.grid': 'Grid', 'field.band': 'Band', 'field.mode': 'Mode', 'field.country': 'Country', 'field.comment': 'Comment', 'field.note': 'Note', 'field.rstTx': 'RST tx', 'field.rstRx': 'RST rx', 'field.txFreq': 'TX Freq (MHz)', 'field.freqTuneHint': 'Type a frequency and press Enter to tune the radio here.', 'field.freq': 'Freq (MHz)', 'field.rxFreq': 'RX Freq (MHz)', 'field.rxBand': 'RX Band', @@ -482,7 +482,7 @@ const fr: Dict = { 'profileScope.saved': 'Enregistré pour le profil', 'profileScope.switch': "— change de profil pour éditer une autre identité.", 'tab.main': 'Principal', 'main.splitTip': 'Faites glisser pour redimensionner les volets — double-clic pour les égaliser', 'tab.recent': 'QSO récents', 'tab.cluster': 'Cluster', 'tab.worked': 'Déjà contacté', 'tab.awards': 'Diplômes', 'tab.bandmap': 'Carte de bande', 'tab.contest': 'Contest', 'tab.net': 'NET', - 'field.callsign': 'Indicatif', 'field.name': 'Nom', 'field.qth': 'QTH', 'field.state': 'État', 'field.grid': 'Locator', + 'field.callsign': 'Indicatif', 'field.name': 'Nom', 'field.qth': 'QTH', 'field.state': 'État', 'field.cnty': 'Comté', 'field.cqz': 'CQ', 'field.ituz': 'ITU', 'field.dxcc': 'DXCC', 'field.grid': 'Locator', 'field.band': 'Bande', 'field.mode': 'Mode', 'field.country': 'Pays', 'field.comment': 'Commentaire', 'field.note': 'Note', 'field.rstTx': 'RST tx', 'field.rstRx': 'RST rx', 'field.txFreq': 'Fréq TX (MHz)', 'field.freqTuneHint': 'Tape une fréquence et appuie sur Entrée pour y accorder la radio.', 'field.freq': 'Fréq (MHz)', 'field.rxFreq': 'Fréq RX (MHz)', 'field.rxBand': 'Bande RX',