mirror of
https://github.com/wavelog/wavelog.git
synced 2026-03-25 03:31:13 +00:00
The contest logging page doesn't have resubmission avoidance so users could click
the save button multiple times and get duplicated QSOs. What's more, this happends
more commonly in contest because of the high pace.
The fix was borrowed from the implimentation in `assets/js/sections/qso.js'.
Ref: e4d17a2a07/assets/js/sections/qso.js (L158)
However, this looks great but could be annoying for slow servers. It could also
be implemented by blanking the qso info earlier so that the user wouldn't be
able to click again. But this may trick users to think the QSO was already uploaded
when it really isn't.
Signed-off-by: William Goodspeed <goodspeed@anche.no>
285 lines
20 KiB
PHP
285 lines
20 KiB
PHP
<script>
|
|
var lang_contestname_warning = "<?= __("You need to start a new session before you can change the contest name!"); ?>";
|
|
var lang_contest_reset_session = "<?= __("Are you really sure you want to start a new contest session?"); ?>";
|
|
|
|
// Get Date format
|
|
var user_date_format = "<?php echo $date_format; ?>";
|
|
var qso_manual = "<?php echo $manual_mode; ?>";
|
|
</script>
|
|
|
|
<div class="container qso_panel contesting">
|
|
<button type="button" class="btn btn-sm btn-warning float-end" onclick="reset_dialog()"><i class="fas fa-sync-alt"></i> <?= __("Start new Contest Session"); ?></button>
|
|
<h2 style="display:inline"><?= __("Contest Logging"); ?> </h2> <?php echo ($manual_mode == 0 ? " <span style='display:inline' class='align-text-top badge text-bg-success'>LIVE</span>" : " <span style='display:inline' class='align-text-top badge text-bg-danger'>POST</span>"); ?>
|
|
<div class="row">
|
|
|
|
<div class="col-sm-12 col-md-12">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<form id="qso_input" name="qsos">
|
|
<div class="mb-3 row">
|
|
<label class="col-auto control-label" for="radio"><?= __("Exchange Type"); ?></label>
|
|
|
|
<div class="col-auto">
|
|
<select class="form-select form-select-sm" id="exchangetype" name="exchangetype">
|
|
<option value='None'><?= __("None"); ?></option>
|
|
<option value='Exchange'><?= __("Exchange"); ?></option>
|
|
<option value='Gridsquare'><?= __("Gridsquare"); ?></option>
|
|
<option value='Serial'><?= __("Serial"); ?></option>
|
|
<option value='Serialexchange'><?= __("Serial + Exchange"); ?></option>
|
|
<option value='Serialgridsquare'><?= __("Serial + Gridsquare"); ?></option>
|
|
<option value='SerialGridExchange'><?= __("Serial + Gridsquare + Exchange"); ?></option>
|
|
</select>
|
|
</div>
|
|
|
|
<label class="col-auto control-label" for="contestname_select"><?= __("Contest Name"); ?></label>
|
|
|
|
<div class="col-auto">
|
|
<select class="form-select form-select-sm" id="contestname_select" name="contestname_select">
|
|
<?php foreach($contestnames as $contest) {
|
|
echo "<option value='" . $contest['adifname'] . "'>" . $contest['name'] . "</option>";
|
|
} ?>
|
|
</select>
|
|
<input type="hidden" id="contestname" name="contestname" />
|
|
</div>
|
|
|
|
<label class="col-auto control-label" for="operatorcall"><?= __("Operator Callsign"); ?></label>
|
|
<div class="col-auto">
|
|
<input type="text" class="form-control form-control-sm uppercase" id="operator_callsign" name="operator_callsign" value='<?php echo $this->session->userdata('operator_callsign'); ?>' required>
|
|
</div>
|
|
<div class="col-auto">
|
|
<a class="btn btn-sm btn-primary" id="moreSettingsButton"><i class="fas fa-wrench"></i> <?= __("More Settings"); ?></a>
|
|
<div class="modal fade" id="moreSettingsModal" tabindex="-1" aria-labelledby="moreSettingsModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="moreSettingsModalLabel"><?= __("More Settings"); ?></h5>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="row mb-3">
|
|
<label class="col-auto control-label"><?= __("Copy received exchange to"); ?></label>
|
|
<div class="form-check-inline col-auto">
|
|
<select class="form-select form-select-sm" id="copyexchangeto" name="copyexchangeto" title="<?= __("Exchange is only copied if it is matching rules for the selected field!"); ?>">
|
|
<option value='None'><?= __("None"); ?></option>
|
|
<option value='dok'><?= __("DOK"); ?></option>
|
|
<option value='name'><?= __("Name"); ?></option>
|
|
<option value='age'><?= __("Age"); ?></option>
|
|
<option value='state'><?= __("State"); ?></option>
|
|
<option value='power'><?= __("RX Power (W)"); ?></option>
|
|
<option value='locator'><?= __("Locator"); ?></option>
|
|
<option value='qth'><?= __("QTH"); ?></option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<label class="col-auto control-label me-1"><?= __("Sequence of Exchanges"); ?>
|
|
<i class="fas fa-question-circle" id="exchangesequence"
|
|
data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="top"
|
|
title="<?= __("Choose in which order you want to type in the different reports. However, only the elements contained in the selected exchange type are displayed."); ?>">
|
|
</i>
|
|
</label>
|
|
<div class="form-check-inline col-auto">
|
|
<select class="form-select form-select-sm" id="exchangesequence_select" name="exchangesequence_select">
|
|
<option value='s-g-e'><?= _pgettext("Keep the translation short!", "Serial"); ?> > <?= _pgettext("Keep the translation short!", "Grid"); ?> > <?= _pgettext("Keep the translation short!", "Exchange"); ?></option>
|
|
<option value='s-e-g'><?= _pgettext("Keep the translation short!", "Serial"); ?> > <?= _pgettext("Keep the translation short!", "Exchange"); ?> > <?= _pgettext("Keep the translation short!", "Grid"); ?></option>
|
|
<option value='g-s-e'><?= _pgettext("Keep the translation short!", "Grid"); ?> > <?= _pgettext("Keep the translation short!", "Serial"); ?> > <?= _pgettext("Keep the translation short!", "Exchange"); ?></option>
|
|
<option value='g-e-s'><?= _pgettext("Keep the translation short!", "Grid"); ?> > <?= _pgettext("Keep the translation short!", "Exchange"); ?> > <?= _pgettext("Keep the translation short!", "Serial"); ?></option>
|
|
<option value='e-s-g'><?= _pgettext("Keep the translation short!", "Exchange"); ?> > <?= _pgettext("Keep the translation short!", "Serial"); ?> > <?= _pgettext("Keep the translation short!", "Grid"); ?></option>
|
|
<option value='e-g-s'><?= _pgettext("Keep the translation short!", "Exchange"); ?> > <?= _pgettext("Keep the translation short!", "Grid"); ?> > <?= _pgettext("Keep the translation short!", "Serial"); ?></option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?= __("Close"); ?></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="mb-3 col-md-2">
|
|
<label for="start_date"><?= __("Date"); ?></label>
|
|
<input type="text" class="form-control form-control-sm input_date" name="start_date" id="start_date" value="<?php if (($this->session->userdata('start_date') != NULL && ((time() - $this->session->userdata('time_stamp')) < 24 * 60 * 60))) { echo $this->session->userdata('start_date'); } else { echo date($date_format);}?>" <?php echo ($manual_mode == 0 ? "disabled" : ""); ?> >
|
|
</div>
|
|
|
|
<div class="mb-3 col-md-1">
|
|
<label for="start_time"><?= __("Time"); ?></label>
|
|
<input type="text" class="form-control form-control-sm input_time" name="start_time" id="start_time" value="<?php if (($this->session->userdata('start_time') != NULL && ((time() - $this->session->userdata('time_stamp')) < 24 * 60 * 60))) { echo substr($this->session->userdata('start_time'),0,5); } else { echo $manual_mode == 0 ? date('H:i:s') : date('H:i'); } ?>" size="7" <?php echo ($manual_mode == 0 ? "disabled" : ""); ?> >
|
|
</div>
|
|
|
|
<?php if ( $manual_mode == 0 ) { ?>
|
|
<input class="input_time" type="hidden" id="start_time" name="start_time"value="<?php echo date('H:i'); ?>" />
|
|
<input class="input_date" type="hidden" id="start_date" name="start_date" value="<?php echo date($date_format); ?>" />
|
|
<?php } ?>
|
|
|
|
<div class="mb-3 col-md-2">
|
|
<label for="mode"><?= __("Mode"); ?></label>
|
|
<select id="mode" class="form-select mode form-select-sm" name="mode">
|
|
<?php foreach($modes->result() as $mode) {
|
|
if ($mode->submode == null) {
|
|
printf("<option value=\"%s\" %s>%s</option>", $mode->mode, $this->session->userdata('mode')==$mode->mode?"selected=\"selected\"":"",$mode->mode);
|
|
} else {
|
|
printf("<option value=\"%s\" %s>⇒ %s</option>", $mode->submode, $this->session->userdata('mode')==$mode->submode?"selected=\"selected\"":"",$mode->submode);
|
|
}
|
|
} ?>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="mb-3 col-md-2">
|
|
<label for="band"><?= __("Band"); ?></label>
|
|
|
|
<select id="band" class="form-select form-select-sm" name="band">
|
|
<?php foreach($bands as $key=>$bandgroup) {
|
|
echo '<optgroup label="' . strtoupper($key) . '">';
|
|
foreach($bandgroup as $band) {
|
|
echo '<option value="' . $band . '"';
|
|
if ($this->session->userdata('band') == $band) echo ' selected';
|
|
echo '>' . $band . '</option>'."\n";
|
|
}
|
|
echo '</optgroup>';
|
|
}
|
|
?>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="mb-3 col-md-2">
|
|
<label for="frequency"><?= __("Frequency"); ?></label>
|
|
<div class="input-group input-group-sm">
|
|
<input type="text" class="form-control form-control-sm" id="freq_calculated" name="freq_calculated" value="0" />
|
|
<small class="input-group-text btn-included-on-field" id="qrg_unit">...</small>
|
|
</div>
|
|
<input style="display: none;" type="text" class="form-control form-control-sm" id="frequency" name="freq_display" value="<?php echo $this->session->userdata('freq'); ?>" />
|
|
</div>
|
|
|
|
<div class="mb-3 col-md-2">
|
|
<label for="inputRadio"><?= __("Radio"); ?></label>
|
|
<select class="form-select form-select-sm radios" id="radio" name="radio">
|
|
<option value="0" selected="selected"><?= __("None"); ?></option>
|
|
<?php foreach ($radios->result() as $row) { ?>
|
|
<option value="<?php echo $row->id; ?>" <?php if($this->session->userdata('radio') == $row->id) { echo "selected=\"selected\""; } ?>><?php echo $row->radio; ?> <?php if ($radio_last_updated->id == $row->id) { echo "(".__("last updated").")"; } else { echo ''; } ?></option>
|
|
<?php } ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-2">
|
|
<div>
|
|
<label for="callsign"><?= __("Callsign"); ?></label>
|
|
<input type="text" class="form-control form-control-sm uppercase" id="callsign" name="callsign" autocomplete="off" required>
|
|
<small id="callsign_info" class="badge text-bg-danger"></small><br/>
|
|
<small id="bearing_info" class="form-text text-muted"></small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-1">
|
|
<div>
|
|
<label for="rst_sent"><?= __("RST (S)"); ?></label>
|
|
<input type="text" class="form-control form-control-sm" name="rst_sent" id="rst_sent" value="59">
|
|
</div>
|
|
</div>
|
|
|
|
<div id="sent_exchange" class="d-flex gap-2">
|
|
<div style="display:none" class="serials">
|
|
<label for="exch_serial_s"><?= __("Serial (S)"); ?></label>
|
|
<input type="number" class="form-control form-control-sm" name="exch_serial_s" id="exch_serial_s" min="0" value="">
|
|
</div>
|
|
|
|
<div style="display:none" class="gridsquares">
|
|
<label for="exch_gridsquare_s"><?= __("Gridsquare (S)"); ?></label>
|
|
<input disabled type="text" class="form-control form-control-sm uppercase" name="exch_gridsquare_s" id="exch_gridsquare_s" value="<?php echo $my_gridsquare;?>">
|
|
</div>
|
|
|
|
<div style="display:none" class="exchanges">
|
|
<label for="exch_sent"><?= __("Exch (S)"); ?></label>
|
|
<input type="text" class="form-control form-control-sm uppercase" name="exch_sent" id="exch_sent" value="">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-1">
|
|
<div>
|
|
<label for="rst_rcvd"><?= __("RST (R)"); ?></label>
|
|
<input type="text" class="form-control form-control-sm" name="rst_rcvd" id="rst_rcvd" value="59">
|
|
</div>
|
|
</div>
|
|
|
|
<div id="rcvd_exchange" class="d-flex gap-2">
|
|
<div style="display:none" class="serialr">
|
|
<label for="exch_serial_r"><?= __("Serial (R)"); ?></label>
|
|
<input type="number" class="form-control form-control-sm" name="exch_serial_r" id="exch_serial_r" min="0" value="">
|
|
</div>
|
|
|
|
<div style="display:none" class="gridsquarer">
|
|
<label for="exch_gridsquare_r"><?= __("Gridsquare (R)"); ?></label>
|
|
<input type="text" class="form-control form-control-sm uppercase" name="locator" id="exch_gridsquare_r" value="">
|
|
</div>
|
|
|
|
<div style="display:none" class="exchanger">
|
|
<label for="exch_rcvd"><?= __("Exch (R)"); ?></label>
|
|
<input type="text" class="form-control form-control-sm uppercase" name="exch_rcvd" id="exch_rcvd" value="">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="mb-3 col-md-5">
|
|
<label for="name"><?= __("Name"); ?></label>
|
|
<input type="text" class="form-control form-control-sm" name="name" id="name" value="">
|
|
</div>
|
|
|
|
<div class="mb-3 col-md-5">
|
|
<label for="comment"><?= __("Comment"); ?></label>
|
|
<input type="text" class="form-control form-control-sm" name="comment" id="comment" value="">
|
|
</div>
|
|
</div>
|
|
|
|
<button type="button" class="mb-3 btn btn-sm btn-secondary" onclick="reset_log_fields()"><i class="fas fa-sync-alt"></i> <?= __("Reset QSO"); ?></button>
|
|
<button type="button" class="mb-3 btn btn-sm btn-primary" onclick="logQso();" id="saveQso"><i class="fas fa-save"></i> <?= __("Save QSO"); ?></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<br/>
|
|
|
|
<!-- Callsign SCP Box -->
|
|
<div class="card callsign-suggest">
|
|
<div class="card-header"><h5 class="card-title"><?= __("Callsign Suggestions"); ?></h5></div>
|
|
|
|
<div class="card-body callsign-suggestions"></div>
|
|
</div>
|
|
|
|
<!-- Past QSO Box -->
|
|
<div class="card log">
|
|
<div class="card-header"><h5 class="card-title"><?= __("Contest Logbook"); ?></h5></div>
|
|
<p>
|
|
|
|
<table style="width:100%" class="table-sm table qsotable table-bordered table-hover table-striped table-condensed text-center">
|
|
<thead>
|
|
<tr class="log_title titles">
|
|
<th><?= __("Date"); ?>/<?= __("Time"); ?></th>
|
|
<th><?= __("Call"); ?></th>
|
|
<th><?= __("Band"); ?></th>
|
|
<th><?= __("Mode"); ?></th>
|
|
<th><?= __("RST (S)"); ?></th>
|
|
<th><?= __("RST (R)"); ?></th>
|
|
<th><?= __("Exch (S)"); ?></th>
|
|
<th><?= __("Exch (R)"); ?></th>
|
|
<th><?= __("Serial (S)"); ?></th>
|
|
<th><?= __("Serial (R)"); ?></th>
|
|
<th><?= __("Gridsquare"); ?></th>
|
|
<th><?= __("VUCC Gridsquare"); ?></th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody class="contest_qso_table_contents">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
?>
|