[feat](trx-logbook): work a contest, and record what came back
Phase 5 of the logbook: the exchange, the entry sponsors take, and the confirmations an award counts. Contest fields go on the contact — the contest, the serials both ways as numbers and as words, and the zones — because an exchange is not always a number: a zone, a section or a name goes in as written. The serial sent and the contest stay between contacts, since they belong to the session and not to the contact just logged, and the serial counts on by itself rather than being retyped forty times an hour. Cabrillo 3.0 is written because ADIF cannot do this job: sponsors take Cabrillo and reject everything else. Its shape is not ADIF's either — the frequency is kilohertz below 30 MHz and a band designator above it, the modes are CW, PH, FM, RY and DG, and the contacts go oldest first, as a contest log is read. The header cannot be derived from a log — how many operators, how much power, what the score is claimed to be — so it comes from the operator, with single-op, low power, all bands and mixed behind it. QSL, LoTW and eQSL states are held as ADIF's single letters, and anything else is refused rather than written: a log that grew states of its own would be one no other program could read. A contact is confirmed when any one of the three says so — an award wants a card or an electronic match, not one of each, and counting them separately would tell the operator they were short of what they have. The bands report counts contacts, distinct stations and confirmations per band, ordered by wavelength as a band plan reads. Closes #54 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7 Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -543,6 +543,24 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
||||
<input type="text" id="log-comment" class="status-input" />
|
||||
</label>
|
||||
</div>
|
||||
<details class="log-contest" id="log-contest-block">
|
||||
<summary>Contest exchange</summary>
|
||||
<div class="log-entry-grid">
|
||||
<label class="log-field">
|
||||
<span>Contest</span>
|
||||
<input type="text" id="log-contest-id" class="status-input" spellcheck="false"
|
||||
placeholder="CQ-WW-SSB" />
|
||||
</label>
|
||||
<label class="log-field log-field-narrow">
|
||||
<span>Serial sent</span>
|
||||
<input type="text" id="log-stx" class="status-input" inputmode="numeric" />
|
||||
</label>
|
||||
<label class="log-field log-field-narrow">
|
||||
<span>Received</span>
|
||||
<input type="text" id="log-srx" class="status-input" />
|
||||
</label>
|
||||
</div>
|
||||
</details>
|
||||
<div class="log-entry-actions">
|
||||
<span id="log-worked-before" class="log-worked" aria-live="polite"></span>
|
||||
<span class="log-entry-buttons">
|
||||
@@ -581,6 +599,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
||||
<th scope="col">Rcvd</th>
|
||||
<th scope="col">Locator</th>
|
||||
<th scope="col">Rig</th>
|
||||
<th scope="col">QSL</th>
|
||||
<th scope="col"><span class="visually-hidden">Actions</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -588,6 +607,68 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
||||
</table>
|
||||
</div>
|
||||
<div id="log-summary" class="log-summary" aria-live="polite"></div>
|
||||
|
||||
<details class="log-report" id="log-statistics-block">
|
||||
<summary>Bands worked</summary>
|
||||
<div class="log-table-wrap">
|
||||
<table class="log-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Band</th>
|
||||
<th scope="col">Contacts</th>
|
||||
<th scope="col">Stations</th>
|
||||
<th scope="col">Confirmed</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="log-statistics-rows"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details class="log-report" id="log-contest-export-block">
|
||||
<summary>Contest entry (Cabrillo)</summary>
|
||||
<p class="log-report-note">
|
||||
Contest logs are submitted in Cabrillo and rejected in anything else.
|
||||
Only the contacts of the contest named here go into the entry.
|
||||
</p>
|
||||
<div class="log-entry-grid">
|
||||
<label class="log-field">
|
||||
<span>Contest</span>
|
||||
<input type="text" id="log-cbr-contest" class="status-input" spellcheck="false"
|
||||
placeholder="CQ-WW-SSB" />
|
||||
</label>
|
||||
<label class="log-field">
|
||||
<span>Callsign</span>
|
||||
<input type="text" id="log-cbr-callsign" class="status-input" spellcheck="false" />
|
||||
</label>
|
||||
<label class="log-field">
|
||||
<span>Operators</span>
|
||||
<select id="log-cbr-operator" class="status-input">
|
||||
<option value="SINGLE-OP">Single operator</option>
|
||||
<option value="MULTI-OP">Multi operator</option>
|
||||
<option value="CHECKLOG">Checklog</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="log-field">
|
||||
<span>Power</span>
|
||||
<select id="log-cbr-power" class="status-input">
|
||||
<option value="LOW">Low</option>
|
||||
<option value="HIGH">High</option>
|
||||
<option value="QRP">QRP</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="log-field log-field-narrow">
|
||||
<span>Claimed score</span>
|
||||
<input type="text" id="log-cbr-score" class="status-input" inputmode="numeric" />
|
||||
</label>
|
||||
</div>
|
||||
<div class="log-entry-actions">
|
||||
<span class="log-entry-buttons">
|
||||
<a id="log-cbr-export" class="log-secondary-btn" href="/api/logbook/export.cbr"
|
||||
download>Export Cabrillo</a>
|
||||
</span>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
<div id="tab-bookmarks" class="tab-panel" style="display:none;">
|
||||
|
||||
Reference in New Issue
Block a user