Files
wavelog/application/views/view_log/qso.php
Fabian Berg c70c2ec5cd Clubstations for Wavelog (#1334)
* feat[clubstations]: New DB structure

* feat[clubstations]: Add clubstationstable in user managment

* feat[clubstations]: Show last operator

* feat[clubstations]: Better solution for last operator. tnx for the hint @int2001

* feat[clubstations]: New Club Model and Controller

* feat[clubstations]: Add "Add User" and "Edit User" functionality

* docs[clubstations]: move comment

* feat[clubstations]: Add "Delete Member" functionality

* feat[clubstations]: some enhancements and javascript

* fix[clubstations]: Wrong message class for flashmessages

* feat[clubstations]: Added Switch in the Header menu (not functional yet)

* feat[clubstations]: clubswitch modal

* fix[clubstations]: Load encryption library if not already loaded

* fix[clubstations]: Prevent direct login attempts to clubstations and enhance impersonation authorization

* fix[clubstations]: Typo

* feat[clubstations]: Only show the operator dialog if there is something fishy

* fix[user]: little UI bug

* feat[impersonate]: Add source uid to session data

* fix[impersonate]: logic adjustment

* feat[clubstations]: Add manage button in header menu for club officers

* fix[clubstations]: typo in permission level check

* fix[clubstations]: Full rights for the admin

* feat[impersonate]: Custom sessiondata

* feat[impersonate]: Implement stop impersonation feature with modal confirmation; "the way back"

* fix(modal): Fix bug where modal was hidden when mouse leaved the browser content

* docs(config): Adjust config description for special callsigns and clubstations

* feat(club): Add club access check helper

* typo

* fix[impersonation]: Better text

* feat(club): Selectize for a efficient user search

* feat(clubstations): Restrict clubstations based on users permission level part 1/x

* adjustments for dev merge

* Adjusted club right for the advanced logbook

* feat[user]: Refactoring of the Action Buttons in the user table

* fix[club_permissions]: normal button instead small one for club permissions

* remove unnecessary line break in modal body

* feat[clubstations]: Add Club Mode badge to the header

* fix[clubstations]: fix maintenance mode

* allow switch back on http

* feat(simplefle): display operator input based on club_access

* small UI adjustments

* small UI adjustments

* moved api page to a index.php file and added support for clubstations

* removed unused stuff

* typo

* radios and api keys

* missed one binding

* fix qso view, even officers do just see their own radios in QSO logging

* omit the need for a relogin to see the changes as an admin

* Omit the need for relogin after club changes in general. It's a question of UX. It's better to accept a little higher DB load (if clubstations are enabled) then the need of an user to relogin. There is some room for improvement by changing user_model->get_by_id() and adding a join there. This can be done later if we see that the load is too high

* If the user is not the creator of the API key, it's likely a clubstation. In this case the callsign of the clubstation can not be the same as the callsign of the user (operator call provided by the user). If this is the case, we need to use the callsign of the creator of the API key

* remove debug messages

* better UI in header

* found a typo

* full access in clubstations for admins (if accessed via admin usertable)

* adjusted text

* adjusted text

* adjust text

* reduce required chars

* bugfix: missing the correct authentication in case the admin was not member of the club. he wasn't able to switch back

* reduce debug messages

* fixed UI bug related to tooltips

* load js in controller

* upps..

* some UI adjustments

* corrected permissions

* if user gets delete we need to remove data in club_permissions and also api keys which were created by this user

* Notify members about new memberships or changes in permission level

* add spinner to save button

* make login/logout process more bulletproof

* remove the relogin cookie after the attempt

* better strategy

* bug where switch back failed if user is no admin

* make api keys more secure

* mask not owned api keys

* removed annoying link

* if a user gets removed from a club we also should delete the corresponding api keys and cat radios

* adjusted wiki link

* Auto creation of logbook and location when new user is created

* store and display locator in uppercase

* same for callsign

* fixed a bug in user/club creation

* Revert "Auto creation of logbook and location when new user is created"
We found another solution to which will be addressed in a second PR
This reverts commit f05f4b7bf0.

* Optimized SQL for stats at userlist

* Source query for lastop "out", because mysql<9.0 can't handle Windowed functions

* adjust migration

* add new columns to users table to get created_at and modified_at

* added a partial down function

* add operator dropdown for clubstations

* fix mig version

* Add some backend restrictions in case a user wants to try something funny with the club

---------

Co-authored-by: Andreas Kristiansen <6977712+AndreasK79@users.noreply.github.com>
Co-authored-by: int2001 <joerg@dj7nt.de>
2025-01-02 10:22:23 +01:00

892 lines
47 KiB
PHP

<?php if ($query->num_rows() > 0) { foreach ($query->result() as $row) { ?>
<div class="container-fluid">
<ul style="margin-bottom: 10px;" class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="table-tab" data-bs-toggle="tab" href="#qsodetails" role="tab" aria-controls="table" aria-selected="true"><?= __("QSO Details"); ?></a>
</li>
<li class="nav-item">
<a id="station-tab" class="nav-link" data-bs-toggle="tab" href="#stationdetails" role="tab" aria-controls="table" aria-selected="true"><?= __("Station Location"); ?></a>
</li>
<?php
if ($row->COL_NOTES != null) {?>
<li class="nav-item">
<a id="notes-tab" class="nav-link" data-bs-toggle="tab" href="#notesdetails" role="tab" aria-controls="table" aria-selected="true"><?= __("Notes"); ?></a>
</li>
<?php }?>
<?php
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) {
echo '<li ';
if (count($qslimages) == 0) {
echo 'hidden ';
}
echo 'class="qslcardtab nav-item">
<a class="nav-link" id="qsltab" data-bs-toggle="tab" href="#qslcard" role="tab" aria-controls="home" aria-selected="false">'. __("QSL Card") .'</a>
</li>';
if (clubaccess_check(9)) {
echo '<li class="nav-item">
<a class="nav-link" id="qslmanagementtab" data-bs-toggle="tab" href="#qslupload" role="tab" aria-controls="home" aria-selected="false">'. __("QSL Management") .'</a>
</li>';
}
}
?>
<?php
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) {
echo '<li ';
if ($row->eqsl_image_file == null) {
echo 'hidden ';
}
echo 'class="eqslcardtab nav-item">
<a class="nav-link" id="eqsltab" data-bs-toggle="tab" href="#eqslcard" role="tab" aria-controls="home" aria-selected="false">'. __("eQSL Card") .'</a>
</li>';
}
?>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane active" id="qsodetails" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col-md">
<table width="100%">
<tr>
<?php
// Get Date format
if($this->session->userdata('user_date_format')) {
// If Logged in and session exists
$custom_date_format = $this->session->userdata('user_date_format');
} else {
// Get Default date format from /config/wavelog.php
$custom_date_format = $this->config->item('qso_date_format');
}
?>
<td><?= __("Date/Time"); ?></td>
<?php if(($this->config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === FALSE || ($this->config->item('show_time'))) { ?>
<td><?php $timestamp = strtotime($row->COL_TIME_ON); echo date($custom_date_format, $timestamp); $timestamp = strtotime($row->COL_TIME_ON); $time_on = date('H:i', $timestamp); echo " at ".$time_on; ?>
<?php $timestamp = strtotime($row->COL_TIME_OFF); $time_off = date('H:i', $timestamp); if ($time_on != $time_off) { echo " - ".$time_off; } ?>
</td>
<?php } else { ?>
<td><?php $timestamp = strtotime($row->COL_TIME_ON); echo date($custom_date_format, $timestamp); ?></td>
<?php } ?>
</tr>
<tr>
<td><?= __("Callsign"); ?></td>
<td><b><?php echo str_replace("0","&Oslash;",strtoupper($row->COL_CALL)); ?></b> <a target="_blank" href="https://www.qrz.com/db/<?php echo strtoupper($row->COL_CALL); ?>"><img width="16" height="16" src="<?php echo base_url(); ?>images/icons/qrz.png" alt="Lookup <?php echo strtoupper($row->COL_CALL); ?> on QRZ.com"></a> <a target="_blank" href="https://www.hamqth.com/<?php echo strtoupper($row->COL_CALL); ?>"><img width="16" height="16" src="<?php echo base_url(); ?>images/icons/hamqth.png" alt="Lookup <?php echo strtoupper($row->COL_CALL); ?> on HamQTH"></a> <a target="_blank" href="http://www.eqsl.cc/Member.cfm?<?php echo strtoupper($row->COL_CALL); ?>"><img width="16" height="16" src="<?php echo base_url(); ?>images/icons/eqsl.png" alt="Lookup <?php echo strtoupper($row->COL_CALL); ?> on eQSL.cc"></a> <a target="_blank" href="https://clublog.org/logsearch.php?log=<?php echo strtoupper($row->COL_CALL); ?>&call=<?php echo strtoupper($row->station_callsign); ?>"><img width="16" height="16" src="<?php echo base_url(); ?>images/icons/clublog.png" alt="Clublog Log Search"></a></td>
</tr>
<tr>
<td><?= __("Band"); ?></td>
<td><?php echo $row->COL_BAND; ?></td>
</tr>
<?php if($this->config->item('display_freq') == true) { ?>
<?php if($row->COL_FREQ != 0) { ?>
<tr>
<td><?= __("Frequency"); ?></td>
<td><?php echo $this->frequency->qrg_conversion($row->COL_FREQ); ?></td>
</tr>
<?php } ?>
<?php if($row->COL_FREQ_RX != 0) { ?>
<tr>
<td><?= __("Frequency (RX)"); ?></td>
<td><?php echo $this->frequency->qrg_conversion($row->COL_FREQ_RX); ?></td>
</tr>
<?php } ?>
<?php } ?>
<tr>
<td><?= __("Mode"); ?></td>
<td><?php echo $row->COL_SUBMODE==null?$row->COL_MODE:$row->COL_SUBMODE; ?></td>
</tr>
<tr>
<td><?= __("RST (S)"); ?></td>
<td><?php echo $row->COL_RST_SENT; ?> <?php if ($row->COL_STX) { ?>(<?php printf("%03d", $row->COL_STX);?>)<?php } ?> <?php if ($row->COL_STX_STRING) { ?>(<?php echo $row->COL_STX_STRING;?>)<?php } ?></td>
</tr>
<tr>
<td><?= __("RST (R)"); ?></td>
<td><?php echo $row->COL_RST_RCVD; ?> <?php if ($row->COL_SRX) { ?>(<?php printf("%03d", $row->COL_SRX);?>)<?php } ?> <?php if ($row->COL_SRX_STRING) { ?>(<?php echo $row->COL_SRX_STRING;?>)<?php } ?></td>
</tr>
<?php if($row->COL_GRIDSQUARE != null) { ?>
<tr>
<td>Gridsquare:</td>
<td><?php echo $row->COL_GRIDSQUARE; ?> <a href="javascript:spawnQrbCalculator('<?php echo $row->station_gridsquare . '\',\'' . $row->COL_GRIDSQUARE; ?>')"><i class="fas fa-globe"></i></a></td>
</tr>
<?php } ?>
<?php if($row->COL_GRIDSQUARE != null && strlen($row->COL_GRIDSQUARE) >= 4) { ?>
<!-- Total Distance Between the Station Profile Gridsquare and Logged Square -->
<tr>
<td><?= __("Total Distance"); //Total distance ?></td>
<td>
<?php
// Cacluate Distance if COL_DISTANCE is not set
$ant_path = $row->COL_ANT_PATH ?? null;
$distance = $this->qra->distance($row->station_gridsquare, $row->COL_GRIDSQUARE, $measurement_base, $ant_path);
switch ($measurement_base) {
case 'M':
$distance .= " mi";
break;
case 'K':
$distance .= " km";
break;
case 'N':
$distance .= " nmi";
break;
}
if ($ant_path != null) {
switch ($row->COL_ANT_PATH) {
case "S":
$distance .= ' <span class="badge bg-secondary">' . __("Short Path") . "</span>";
break;
case "L":
$distance .= ' <span class="badge bg-secondary">' . __("Long Path") . "</span>";
break;
case "O":
$distance .= ' <span class="badge bg-secondary">' . __("Other Path") . "</span>";
break;
case "G":
$distance .= ' <span class="badge bg-secondary">' . __("Greyline") . "</span>";
break;
default:
break;
}
}
echo $distance;
?>
</td>
</tr>
<?php } ?>
<?php if($row->COL_VUCC_GRIDS != null) { ?>
<tr>
<td>Gridsquare (Multi):</td>
<td><?php echo $row->COL_VUCC_GRIDS; ?> <a href="javascript:spawnQrbCalculator('<?php echo $row->station_gridsquare . '\',\'' . $row->COL_VUCC_GRIDS; ?>')"><i class="fas fa-globe"></i></a></td>
<?php
// Cacluate Distance
$distance = $this->qra->distance($row->station_gridsquare, $row->COL_VUCC_GRIDS, $measurement_base, $row->COL_ANT_PATH ?? null);
switch ($measurement_base) {
case 'M':
$distance .= " mi";
break;
case 'K':
$distance .= " km";
break;
case 'N':
$distance .= " nmi";
break;
}
echo $distance;
?>
</tr>
<?php } ?>
<?php if($row->COL_STATE != null) { ?>
<tr>
<td><?php echo $primary_subdivision ?>:</td>
<td><?php if ($row->subdivision != '') { echo $row->subdivision.' ('.$row->COL_STATE.')'; } else { echo $row->COL_STATE; } ?></td>
</tr>
<?php } ?>
<?php if($row->COL_CNTY != null && $row->COL_CNTY != ",") { ?>
<tr>
<td><?php echo $secondary_subdivision ?>:</td>
<td><?php echo $row->COL_CNTY; ?></td>
</tr>
<?php } ?>
<?php if($row->COL_NAME != null) { ?>
<tr>
<td><?= __("Name"); ?></td>
<td><?php echo $row->COL_NAME; ?></td>
</tr>
<?php } ?>
<?php if(($this->config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === FALSE) { ?>
<?php if($row->COL_COMMENT != null) { ?>
<tr>
<td><?= __("Comment"); ?></td>
<td><?php echo $row->COL_COMMENT; ?></td>
</tr>
<?php } ?>
<?php } ?>
<?php if($row->COL_PROP_MODE != null and $row->COL_PROP_MODE != '') { ?>
<tr>
<td><?= __("Propagation"); ?></td>
<td><?php switch ($row->COL_PROP_MODE) {
case 'AS':
echo _pgettext("Propagation Mode", "Aircraft Scatter");
break;
case 'AUR':
echo _pgettext("Propagation Mode", "Aurora");
break;
case 'AUE':
echo _pgettext("Propagation Mode", "Aurora-E");
break;
case 'BS':
echo _pgettext("Propagation Mode", "Back scatter");
break;
case 'ECH':
echo _pgettext("Propagation Mode", "EchoLink");
break;
case 'EME':
echo _pgettext("Propagation Mode", "Earth-Moon-Earth");
break;
case 'ES':
echo _pgettext("Propagation Mode", "Sporadic E");
break;
case 'FAI':
echo _pgettext("Propagation Mode", "Field Aligned Irregularities");
break;
case 'F2':
echo _pgettext("Propagation Mode", "F2 Reflection");
break;
case 'INTERNET':
echo _pgettext("Propagation Mode", "Internet-assisted");
break;
case 'ION':
echo _pgettext("Propagation Mode", "Ionoscatter");
break;
case 'IRL':
echo _pgettext("Propagation Mode", "IRLP");
break;
case 'MS':
echo _pgettext("Propagation Mode", "Meteor scatter");
break;
case 'RPT':
echo _pgettext("Propagation Mode", "Terrestrial or atmospheric repeater or transponder");
break;
case 'RS':
echo _pgettext("Propagation Mode", "Rain scatter");
break;
case 'SAT':
echo _pgettext("Propagation Mode", "Satellite");
break;
case 'TEP':
echo _pgettext("Propagation Mode", "Trans-equatorial");
break;
case 'TR':
echo _pgettext("Propagation Mode", "Tropospheric ducting");
break;
default:
echo __("unknown");
break;
}
?></td>
</tr>
<?php } ?>
<?php if($row->COL_SAT_NAME != null) { ?>
<tr>
<td><?= __("Satellite Name"); ?></td>
<td><a href="https://db.satnogs.org/search/?q=<?php echo $row->COL_SAT_NAME; ?>" target="_blank">
<?php if ($row->sat_displayname != null) {
echo $row->sat_displayname." (".$row->COL_SAT_NAME.")";
} else {
echo $row->COL_SAT_NAME;
}
?>
</a></td>
</tr>
<?php } ?>
<?php if($row->COL_SAT_MODE != null) { ?>
<tr>
<td><?= __("Satellite Mode"); ?></td>
<td><?php echo (strlen($row->COL_SAT_MODE) == 2 ? (strtoupper($row->COL_SAT_MODE[0]).'/'.strtoupper($row->COL_SAT_MODE[1])) : strtoupper($row->COL_SAT_MODE)); ?></td>
</tr>
<?php } ?>
<?php if($row->COL_ANT_AZ != null) { ?>
<tr>
<td><?= __("Antenna Azimuth"); ?></td>
<td><?php echo round($row->COL_ANT_AZ, 1); ?>&deg; <span style="margin-left: 2px; display: inline-block; transform: rotate(<?php echo (-45+$row->COL_ANT_AZ); ?>deg);"><i class="fas fa-location-arrow fa-xs"></i></span></td>
</tr>
<?php } ?>
<?php if($row->COL_ANT_EL != null) { ?>
<tr>
<td><?= __("Antenna Elevation"); ?></td>
<td><?php echo round($row->COL_ANT_EL, 1); ?>&deg; <span style="margin-left: 2px; display: inline-block; transform: rotate(<?php echo (-$row->COL_ANT_EL); ?>deg);"><i class="fas fa-arrow-right fa-xs"></i></span></td>
</tr>
<?php } ?>
<?php if($row->name != null) { ?>
<tr>
<td><?= __("Country"); ?></td>
<td><?php if ($row->adif == '0') {
echo $row->name;
} else {
echo ucwords(strtolower(($row->name)), "- (/"); if ($dxccFlag != null) { echo " ".$dxccFlag; } if ($row->end != null) { echo ' <span class="badge text-bg-danger">'.__("Deleted DXCC").'</span>'; }
} ?></td>
</tr>
<?php } ?>
<?php if($row->COL_CONT != null) { ?>
<tr>
<td><?= __("Continent"); ?></td>
<td>
<?php
switch($row->COL_CONT) {
case "AF":
echo __("Africa");
break;
case "AN":
echo __("Antarctica");
break;
case "AS":
echo __("Asia");
break;
case "EU":
echo __("Europe");
break;
case "NA":
echo __("North America");
break;
case "OC":
echo __("Oceania");
break;
case "SA":
echo __("South America");
break;
}
?>
</td>
</tr>
<?php } ?>
<?php if($row->COL_CONTEST_ID != null) { ?>
<tr>
<td><?= __("Contest Name"); ?></td>
<td><?php echo $row->COL_CONTEST_ID; ?></td>
</tr>
<?php } ?>
<?php if($row->COL_IOTA != null) { ?>
<tr>
<td><?= __("IOTA Reference"); ?></td>
<td><a href="https://www.iota-world.org/iotamaps/?grpref=<?php echo $row->COL_IOTA; ?>" target="_blank"><?php echo $row->COL_IOTA; ?></a></td>
</tr>
<?php } ?>
<?php if($row->COL_SOTA_REF != null) { ?>
<tr>
<td><?= __("SOTA Reference"); ?></td>
<td><a href="https://summits.sota.org.uk/summit/<?php echo $row->COL_SOTA_REF; ?>" target="_blank"><?php echo $row->COL_SOTA_REF; ?></a></td>
</tr>
<?php } ?>
<?php if($row->COL_WWFF_REF != null) { ?>
<tr>
<td><?= __("WWFF Reference"); ?></td>
<td><a href="https://www.cqgma.org/zinfo.php?ref=<?php echo $row->COL_WWFF_REF; ?>" target="_blank"><?php echo $row->COL_WWFF_REF; ?></a></td>
</tr>
<?php } ?>
<?php if($row->COL_POTA_REF != null) { ?>
<tr>
<td><?= __("POTA Reference(s)"); ?></td>
<td>
<?php
$pota_refs = explode(',', $row->COL_POTA_REF);
$link_output = '';
foreach ($pota_refs as $pota_ref) {
$pota_ref = trim($pota_ref);
if (!empty($pota_ref)) {
$link_output .= '<a href="https://pota.app/#/park/' . $pota_ref . '" target="_blank">' . $pota_ref . '</a>, ';
}
}
$link_output = rtrim($link_output, ', ');
echo $link_output;
?>
</td>
</tr>
<?php } ?>
<?php if($row->COL_SIG != null) { ?>
<tr>
<td><?= __("Sig"); ?></td>
<?php
switch ($row->COL_SIG) {
case "GMA":
echo "<td><a href=\"https://cqgma.org/\" target=\"_blank\">".$row->COL_SIG."</a></td>";
break;
default:
echo "<td>".$row->COL_SIG."</td>";
break;
}
?>
</tr>
<?php } ?>
<?php if($row->COL_SIG_INFO != null) { ?>
<tr>
<td><?= __("Sig Info"); ?></td>
<?php
switch ($row->COL_SIG) {
case "GMA":
echo "<td><a href=\"https://www.cqgma.org/zinfo.php?ref=".$row->COL_SIG_INFO."\" target=\"_blank\">".$row->COL_SIG_INFO."</a></td>";
break;
case "MQC":
echo "<td><a href=\"https://www.mountainqrp.it/awards/referenza.php?ref=".$row->COL_SIG_INFO."\" target=\"_blank\">".$row->COL_SIG_INFO."</a></td>";
break;
default:
echo "<td>".$row->COL_SIG_INFO."</td>";
break;
}
?>
</tr>
<?php } ?>
<?php if($row->COL_DARC_DOK != null) { ?>
<tr>
<td><?= __("DOK"); ?></td>
<?php if (preg_match('/^[A-Y]\d{2}$/', $row->COL_DARC_DOK)) { ?>
<td><a href="https://www.darc.de/<?php echo $row->COL_DARC_DOK; ?>" target="_blank"><?php echo $row->COL_DARC_DOK; ?></a></td>
<?php } else if (preg_match('/^DV[ABCDEFGHIKLMNOPQRSTUVWXY]$/', $row->COL_DARC_DOK)) { ?>
<td><a href="https://www.darc.de/der-club/distrikte/<?php echo strtolower(substr($row->COL_DARC_DOK, 2, 1)); ?>" target="_blank"><?php echo $row->COL_DARC_DOK; ?></a></td>
<?php } else if (preg_match('/^Z\d{2}$/', $row->COL_DARC_DOK)) { ?>
<td><a href="https://<?php echo $row->COL_DARC_DOK; ?>.vfdb.org" target="_blank"><?php echo $row->COL_DARC_DOK; ?></a></td>
<?php } else { ?>
<td><?php echo $row->COL_DARC_DOK; ?></td>
<?php } ?>
</tr>
<?php } ?>
<?php if($row->COL_REGION != null) { ?>
<tr>
<td><?= __("Region"); ?></td>
<td><?php echo $this->logbook_model->getLongRegion($row->COL_REGION).' ('.$row->COL_REGION.')'; ?></td>
</tr>
<?php } ?>
<?php if($row->COL_EMAIL != null) { ?>
<tr>
<td><?= __("E-mail"); ?></td>
<td><a href="mailto:<?php echo $row->COL_EMAIL; ?>"><?php echo $row->COL_EMAIL; ?></a></td>
</tr>
<?php } ?>
</table>
<?php if($row->COL_QSL_SENT == "Y" || $row->COL_QSL_RCVD == "Y") { ?>
<h3><?= __("QSL Info"); ?></h3>
<?php if($row->COL_QSL_SENT == "Y") {?>
<?php if ($row->COL_QSL_SENT_VIA == "B") { ?>
<p><?= __("QSL Card has been sent via the bureau"); ?>
<?php } else if($row->COL_QSL_SENT_VIA == "D") { ?>
<p><?= __("QSL Card has been sent via direct"); ?>
<?php } else if($row->COL_QSL_SENT_VIA == "E") { ?>
<p><?= __("QSL Card has been sent electronically"); ?>
<?php } else if($row->COL_QSL_SENT_VIA == "M") { ?>
<p><?= __("QSL Card has been sent via manager"); ?>
<?php } else { ?>
<p><?= __("QSL Card has been sent"); ?>
<?php } ?>
<?php if ($row->COL_QSLSDATE != null) { ?>
<?php $timestamp = strtotime($row->COL_QSLSDATE); echo " (".date($custom_date_format, $timestamp).")"; ?></p>
<?php } ?>
<?php } ?>
<?php if($row->COL_QSL_RCVD == "Y") { ?>
<?php if ($row->COL_QSL_RCVD_VIA == "B") { ?>
<p><?= __("QSL Card has been received via the bureau"); ?>
<?php } else if($row->COL_QSL_RCVD_VIA == "D") { ?>
<p><?= __("QSL Card has been received via direct"); ?>
<?php } else if($row->COL_QSL_RCVD_VIA == "E") { ?>
<p><?= __("QSL Card has been received electronically"); ?>
<?php } else if($row->COL_QSL_RCVD_VIA == "M") { ?>
<p><?= __("QSL Card has been received via manager"); ?>
<?php } else { ?>
<p><?= __("QSL Card has been received"); ?>
<?php } ?>
<?php if ($row->COL_QSLRDATE != null) { ?>
<?php $timestamp = strtotime($row->COL_QSLRDATE); echo " (".date($custom_date_format, $timestamp).")"; ?></p>
<?php } ?>
<?php } ?>
<?php } ?>
<?php if($row->lotwuser != null) { ?>
<br /><p><?= __("This station uses LoTW."); ?> <a href="https://lotw.arrl.org/lotwuser/act?act=<?php echo $row->COL_CALL;?>" target="_blank"><?= __("Last Upload").'</a>: '; ?><?php $timestamp = strtotime($row->lastupload); echo date($custom_date_format, $timestamp); $timestamp = strtotime($row->lastupload); echo " ".date('H:i', $timestamp);?> UTC.</p>
<?php } ?>
<?php if($row->COL_LOTW_QSL_RCVD == "Y" && $row->COL_LOTW_QSLRDATE != null) { ?>
<h3><?= __("LoTW"); ?></h3>
<p><?= __("This QSO was confirmed on"); ?> <?php $timestamp = strtotime($row->COL_LOTW_QSLRDATE); echo date($custom_date_format, $timestamp); ?>.</p>
<?php } ?>
<?php if($row->COL_LOTW_QSL_RCVD == "Y" && $row->COL_LOTW_QSLRDATE == null) { ?>
<h3><?= __("LoTW"); ?></h3>
<p><?= __("This QSO is confirmed on LoTW."); ?></p>
<?php } ?>
<?php if($row->COL_EQSL_QSL_RCVD == "Y" && $row->COL_EQSL_QSLRDATE != null) { ?>
<h3>eQSL</h3>
<p><?= __("This QSO was confirmed on"); ?> <?php $timestamp = strtotime($row->COL_EQSL_QSLRDATE); echo date($custom_date_format, $timestamp); ?>.</p>
<?php } ?>
<?php if($row->COL_EQSL_QSL_RCVD == "Y" && $row->COL_EQSL_QSLRDATE == null) { ?>
<h3>eQSL</h3>
<p><?= __("This QSO is confirmed on eQSL."); ?></p>
<?php } ?>
<?php if($row->COL_QRZCOM_QSO_DOWNLOAD_STATUS == "Y" && $row->COL_QRZCOM_QSO_DOWNLOAD_DATE != null) { ?>
<h3>QRZ.com</h3>
<p><?= __("This QSO was confirmed on"); ?> <?php $timestamp = strtotime($row->COL_QRZCOM_QSO_DOWNLOAD_DATE); echo date($custom_date_format, $timestamp); ?>.</p>
<?php } ?>
<?php if($row->COL_QRZCOM_QSO_DOWNLOAD_STATUS == "Y" && $row->COL_QRZCOM_QSO_DOWNLOAD_DATE == null) { ?>
<h3>QRZ.com</h3>
<p><?= __("This QSO is confirmed on QRZ.com."); ?></p>
<?php } ?>
<?php if($row->COL_CLUBLOG_QSO_DOWNLOAD_STATUS == "Y" && $row->COL_CLUBLOG_QSO_DOWNLOAD_DATE != null) { ?>
<h3><?= __("Clublog"); ?></h3>
<p><?= __("This QSO was confirmed on"); ?> <?php $timestamp = strtotime($row->COL_CLUBLOG_QSO_DOWNLOAD_DATE); echo date($custom_date_format, $timestamp); ?>.</p>
<?php } ?>
<?php if($row->COL_CLUBLOG_QSO_DOWNLOAD_STATUS == "Y" && $row->COL_CLUBLOG_QSO_DOWNLOAD_DATE == null) { ?>
<h3><?= __("Clublog"); ?></h3>
<p><?= __("This QSO is confirmed on Clublog."); ?></p>
<?php } ?>
</div>
<div class="col-md">
<div id="mapqso" class="map-leaflet" style="width: 100%; height: 250px"></div>
<?php if(($this->config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === FALSE) { ?>
<br>
<?php if (clubaccess_check(3, $row->COL_PRIMARY_KEY)) { ?>
<div style="display: inline-block;"><p class="editButton"><a class="btn btn-primary" href="<?php echo site_url('qso/edit'); ?>/<?php echo $row->COL_PRIMARY_KEY; ?>" href="javascript:;"><i class="fas fa-edit"></i> <?= __("Edit QSO"); ?></a></p></div>
<?php } ?>
<div style="display: inline-block;"><form method="POST" action="<?php echo site_url('search'); ?>"><input type="hidden" value="<?php echo strtoupper($row->COL_CALL); ?>" name="callsign"><button class="btn btn-primary" type="submit"><i class="fas fa-eye"></i> <?= __("More QSOs"); ?></button></form></div>
<?php } ?>
<?php
if($row->COL_SAT_NAME != null) {
$twitter_band_sat = $row->COL_SAT_NAME." \u{1F6F0}\u{FE0F}";
if($row->COL_ANT_EL != null && $row->COL_ANT_AZ != null ) {
$twitter_band_sat .= " (".$row->COL_ANT_EL."° el / ".$row->COL_ANT_AZ."° az)";
}
$hashtags = "#hamr #wavelog #amsat";
} else {
$twitter_band_sat = $row->COL_BAND;
$hashtags = "#hamr #wavelog";
}
if($row->COL_IOTA != null) {
$hashtags .= " #IOTA ".$row->COL_IOTA;
}
if($row->COL_SOTA_REF != null) {
$hashtags .= " #SOTA ".$row->COL_SOTA_REF;
}
if($row->COL_POTA_REF != null) {
$hashtags .= " #POTA ".$row->COL_POTA_REF;
}
if($row->COL_WWFF_REF != null) {
$hashtags .= " #WWFF ".$row->COL_WWFF_REF;
}
if($row->COL_SIG != null && $row->COL_SIG_INFO != null) {
$hashtags .= " #".$row->COL_SIG." ".$row->COL_SIG_INFO;
}
if (!isset($distance)) {
$twitter_string = "Just worked ".$row->COL_CALL." ";
if ($row->COL_DXCC != 0) {
$twitter_string .= "in ".ucwords(strtolower(($row->COL_COUNTRY)))." ";
}
$twitter_string .= "on ".$twitter_band_sat." using ".($row->COL_SUBMODE==null?$row->COL_MODE:$row->COL_SUBMODE)." ".$hashtags;
} else {
$twitter_string = "Just worked ".$row->COL_CALL." ";
if ($row->COL_DXCC != 0) {
$twitter_string .= "in ".ucwords(strtolower(($row->COL_COUNTRY)))." ";
if ($dxccFlag != null) {
$twitter_string .= $dxccFlag." ";
}
}
$distancestring = '';
if ($row->COL_VUCC_GRIDS == null) {
$distancestring = "(Gridsquare: ".$row->COL_GRIDSQUARE." / distance: ".$distance.")";
} else {
if (substr_count($row->COL_VUCC_GRIDS, ',') == 1) {
$distancestring = "(Gridline: ".preg_replace('/\s+/', '', $row->COL_VUCC_GRIDS)." / distance: ".$distance.")";
} else if (substr_count($row->COL_VUCC_GRIDS, ',') == 3) {
$distancestring = "(Gridcorner: ".preg_replace('/\s+/', '', $row->COL_VUCC_GRIDS)." / distance: ".$distance.")";
} else {
$distancestring = "(Grids: ".$row->COL_VUCC_GRIDS.")";
}
}
$twitter_string .= $distancestring." on ".$twitter_band_sat." using ".($row->COL_SUBMODE==null?$row->COL_MODE:$row->COL_SUBMODE)." ".$hashtags;
}
?>
<button class="btn btn-primary" onClick='shareModal(<?php echo json_encode(['qso' => $row, 'twitter_string' => $twitter_string]); ?>);'><i class="fas fa-share-square"></i> <?= __("Share"); ?></button>
</div>
</div>
</div>
<div class="tab-pane fade" id="stationdetails" role="tabpanel" aria-labelledby="table-tab">
<h3><?= __("Station") . ' ' . __("Details"); ?></h3>
<table width="100%">
<tr>
<td><?= __("Station") . ' ' . __("Callsign"); ?></td>
<td><?php echo str_replace("0","&Oslash;",strtoupper($row->station_callsign)); ?></td>
</tr>
<tr>
<td><?= __("Station") . ' ' . __("Name"); ?></td>
<td><?php echo $row->station_profile_name; ?></td>
</tr>
<tr>
<td><?= __("Station") . ' ' . __("Gridsquare"); ?></td>
<td><?php echo $row->station_gridsquare; ?></td>
</tr>
<?php if($row->station_city) { ?>
<tr>
<td><?= __("Station") . ' ' . __("City"); ?></td>
<td><?php echo $row->station_city; ?></td>
</tr>
<?php } ?>
<?php if($row->station_country) { ?>
<tr>
<td><?= __("Station") . ' ' . __("Country"); ?></td>
<td><?php echo ucwords(strtolower(($row->station_country)), "- (/"); if ($row->station_end != null) echo ' <span class="badge text-bg-danger">'.__("Deleted DXCC").'</span>'; ?></td>
</tr>
<?php } ?>
<?php if($row->COL_OPERATOR) { ?>
<tr>
<td><?= __("Station") . ' ' . __("Operator"); ?></td>
<td><?php echo $row->COL_OPERATOR; ?></td>
</tr>
<?php } ?>
<?php if($row->COL_TX_PWR) { ?>
<tr>
<td><?= __("Station") . ' ' . __("Transmit Power (W)"); ?></td>
<td><?php echo $row->COL_TX_PWR; ?> W</td>
</tr>
<?php } ?>
<?php if($row->station_iota) { ?>
<tr>
<td><?= __("Station") . ' ' . __("IOTA Reference"); ?></td>
<td><?php echo $row->station_iota; ?></td>
</tr>
<?php } ?>
<?php if($row->station_sota) { ?>
<tr>
<td><?= __("Station") . ' ' . __("SOTA Reference"); ?></td>
<td><?php echo $row->station_sota; ?></td>
</tr>
<?php } ?>
<?php if($row->station_wwff) { ?>
<tr>
<td><?= __("Station") . ' ' . __("WWFF Reference"); ?></td>
<td><?php echo $row->station_wwff; ?></td>
</tr>
<?php } ?>
<?php if($row->station_pota) { ?>
<tr>
<td><?= __("Station") . ' ' . __("POTA Reference(s)"); ?></td>
<td><?php echo $row->station_pota; ?></td>
</tr>
<?php } ?>
<?php if($row->station_sig) { ?>
<tr>
<td><?= __("Station") . ' ' . __("Sig"); ?></td>
<td><?php echo $row->station_sig; ?></td>
</tr>
<tr>
<td><?= __("Station") . ' ' . __("Sig Info"); ?></td>
<td><?php echo $row->station_sig_info; ?></td>
</tr>
<?php } ?>
</table>
</div>
<div class="tab-pane fade" id="notesdetails" role="tabpanel" aria-labelledby="table-tab">
<h3><?= __("Notes"); ?></h3>
<?php if (isset($row->COL_NOTES)) { echo nl2br($row->COL_NOTES); } ?>
</div>
<?php
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) {
?>
<div class="tab-pane fade" id="qslupload" role="tabpanel" aria-labelledby="table-tab">
<?php
if (!($this->config->item('disable_qsl') ?? false)) {
if (count($qslimages) > 0) {
echo '<table style="width:100%" class="qsltable table table-sm table-bordered table-hover table-striped table-condensed">
<thead>
<tr>
<th style=\'text-align: center\'>' . __("QSL image file") . '</th>
<th style=\'text-align: center\'></th>
<th style=\'text-align: center\'></th>
</tr>
</thead><tbody>';
foreach ($qslimages as $qsl) {
echo '<tr>';
echo '<td style=\'text-align: center\'>' . $qsl->filename . '</td>';
echo '<td id="'.$qsl->id.'" style=\'text-align: center\'><button onclick="deleteQsl('.$qsl->id.')" class="btn btn-sm btn-danger">' . __("Delete") . '</button></td>';
echo '<td style=\'text-align: center\'><button onclick="viewQsl(\''.$qsl->filename.'\')" class="btn btn-sm btn-success">' . __("View") . '</button></td>';
echo '</tr>';
}
echo '</tbody></table>';
}
?>
<p><div class="alert alert-warning" role="alert"><span class="badge text-bg-warning"><?= __("Warning"); ?></span> <?= __("Maximum file upload size is "); ?> <?php echo $max_upload; ?>B.</div></p>
<form class="form" id="fileinfo" name="fileinfo" enctype="multipart/form-data">
<div class="row">
<div class="col-md">
<fieldset>
<div class="mb-3">
<label for="qslcardfront"><?= __("Uploaded QSL Card front image"); ?></label>
<input class="form-control" type="file" id="qslcardfront" name="qslcardfront" accept="image/*" >
</div>
<input type="hidden" class="form-control" id="qsoinputid" name="qsoid" value="<?php echo $row->COL_PRIMARY_KEY; ?>">
<button type="button" onclick="uploadQsl();" id="button1id" name="button1id" class="btn btn-primary"><?= __("Upload QSL Card image"); ?></button>
</div>
<div class="col-md">
<div class="mb-3">
<label for="qslcardback"><?= __("Uploaded QSL Card back image"); ?></label>
<input class="form-control" type="file" id="qslcardback" name="qslcardback" accept="image/*">
</div>
</fieldset>
</div>
</div>
</form>
<?php } ?>
<p>
<div class="row">
<div class="col-md">
<button type="button" onclick="qsl_rcvd(<?php echo $row->COL_PRIMARY_KEY; ?>, 'B');" id="qslrxb" name="qslrxb" class="btn btn-sm btn-success ld-ext-right ld-ext-right-r-B"><i class="fas fa-envelope"></i> <?= __("Mark QSL Received (Bureau)"); ?> <div class="ld ld-ring ld-spin"></div></button>
<button type="button" onclick="qsl_rcvd(<?php echo $row->COL_PRIMARY_KEY; ?>, 'D');" id="qslrxd" name="qslrxd" class="btn btn-sm btn-success ld-ext-right ld-ext-right-r-D"><i class="fas fa-envelope"></i> <?= __("Mark QSL Received (Direct)"); ?> <div class="ld ld-ring ld-spin"></div></button>
<button type="button" onclick="qsl_rcvd(<?php echo $row->COL_PRIMARY_KEY; ?>, 'E');" id="qslrxe" name="qslrxe" class="btn btn-sm btn-success ld-ext-right ld-ext-right-r-E"><i class="fas fa-envelope"></i> <?= __("Mark QSL Received (Electronic)"); ?> <div class="ld ld-ring ld-spin"></div></button>
</div>
</div>
<p>
<div class="row">
<div class="col-md">
<button type="button" onclick="qsl_requested(<?php echo $row->COL_PRIMARY_KEY; ?>, 'B');" id="qsltxb" name="qsltxb" class="btn btn-sm btn-warning ld-ext-right ld-ext-right-t-B"><i class="fas fa-envelope"></i> <?= __("Mark QSL Card Requested (Bureau)"); ?> <div class="ld ld-ring ld-spin"></div></button>
<button type="button" onclick="qsl_requested(<?php echo $row->COL_PRIMARY_KEY; ?>, 'D');" id="qsltxd" name="qsltxd" class="btn btn-sm btn-warning ld-ext-right ld-ext-right-t-D"><i class="fas fa-envelope"></i> <?= __("Mark QSL Card Requested (Direct)"); ?> <div class="ld ld-ring ld-spin"></div></button>
<button type="button" onclick="qsl_ignore(<?php echo $row->COL_PRIMARY_KEY; ?>, 'I');" id="qsltxi" name="qsltxi" class="btn btn-sm btn-warning ld-ext-right ld-ext-right-ignore"><i class="fas fa-envelope"></i> <?= __("Mark QSL Card Not Required"); ?> <div class="ld ld-ring ld-spin"></div></button>
</div>
</div>
</div>
<div class="tab-pane fade" id="qslcard" role="tabpanel" aria-labelledby="table-tab">
<?php $this->load->view('qslcard/qslcarousel', $qslimages); ?>
</div>
<div class="tab-pane fade" id="eqslcard" role="tabpanel" aria-labelledby="table-tab">
<?php
if ($row->eqsl_image_file != null) {
echo '<img class="d-block" src="' . base_url() . '/'. $this->paths->getPathEqsl() .'/' . $row->eqsl_image_file .'" alt="' . __("eQSL picture") . '">';
}
?>
</div>
<?php
}
?>
</div>
</div>
<?php
if($row->COL_GRIDSQUARE != null && strlen($row->COL_GRIDSQUARE) >= 4) {
$stn_loc = $this->qra->qra2latlong(trim($row->COL_GRIDSQUARE));
if($stn_loc[0] != 0) {
$lat = $stn_loc[0];
$lng = $stn_loc[1];
}
} elseif($row->COL_VUCC_GRIDS != null) {
$grids = explode(",", $row->COL_VUCC_GRIDS);
if (count($grids) == 2) {
$grid1 = $this->qra->qra2latlong(trim($grids[0]));
$grid2 = $this->qra->qra2latlong(trim($grids[1]));
$coords[]=array('lat' => $grid1[0],'lng'=> $grid1[1]);
$coords[]=array('lat' => $grid2[0],'lng'=> $grid2[1]);
$midpoint = $this->qra->get_midpoint($coords);
$lat = $midpoint[0];
$lng = $midpoint[1];
}
if (count($grids) == 4) {
$grid1 = $this->qra->qra2latlong(trim($grids[0]));
$grid2 = $this->qra->qra2latlong(trim($grids[1]));
$grid3 = $this->qra->qra2latlong(trim($grids[2]));
$grid4 = $this->qra->qra2latlong(trim($grids[3]));
$coords[]=array('lat' => $grid1[0],'lng'=> $grid1[1]);
$coords[]=array('lat' => $grid2[0],'lng'=> $grid2[1]);
$coords[]=array('lat' => $grid3[0],'lng'=> $grid3[1]);
$coords[]=array('lat' => $grid4[0],'lng'=> $grid4[1]);
$midpoint = $this->qra->get_midpoint($coords);
$lat = $midpoint[0];
$lng = $midpoint[1];
}
} else {
if(isset($row->lat)) {
$lat = $row->lat;
} else {
$lat = 0;
}
if(isset($row->long)) {
$lng = $row->long;
} else {
$lng = 0;
}
}
?>
<script>
var lat = <?php echo $lat; ?>;
var long = <?php echo $lng; ?>;
var callsign = "<?php echo $row->COL_CALL; ?>";
</script>
<div hidden id ='lat'><?php echo $lat; ?></div>
<div hidden id ='long'><?php echo $lng; ?></div>
<div hidden id ='callsign'><?php echo $row->COL_CALL; ?></div>
<div hidden id ='qsoid'><?php echo $row->COL_PRIMARY_KEY; ?></div>
<?php } } ?>