2019-01-09 15:18:46 +00:00
<! doctype html >
2024-06-06 10:47:55 +02:00
< html lang = " <?php echo $language['code'] ; ?> " >
2023-09-12 14:30:28 +01:00
< head >
<!-- Required meta tags -->
< meta charset = " utf-8 " >
< meta name = " viewport " content = " width=device-width, initial-scale=1, shrink-to-fit=no " >
2023-11-02 20:58:40 +01:00
< meta name = " apple-mobile-web-app-capable " content = " yes " >
2023-11-05 14:07:05 +01:00
< meta name = " mobile-web-app-capable " content = " yes " >
< meta name = " apple-mobile-web-app-status-bar-style " content = " default " >
2024-12-10 19:59:18 +01:00
< link rel = " manifest " href = " <?php echo $this->paths ->cache_buster('/manifest.json'); ?> " />
2023-11-23 12:14:37 +01:00
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/buttons.dataTables.min.css'); ?> " />
2024-01-31 11:34:39 +00:00
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/datatables.min.css'); ?> " />
2024-01-31 11:34:39 +00:00
2023-09-12 14:30:28 +01:00
<!-- Bootstrap CSS -->
2024-05-28 10:04:01 +02:00
< ? php
$theme = $this -> optionslib -> get_theme ();
if ( $theme ) { ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/bootstrap-multiselect.css'); ?> " >
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/'. $theme .'/bootstrap.min.css'); ?> " >
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/general.css'); ?> " >
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/selectize.bootstrap4.css'); ?> " />
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/bootstrap-dialog.css'); ?> " />
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/'. $theme .'/overrides.css'); ?> " >
2020-09-24 20:03:05 +01:00
< ? php } ?>
2020-12-06 17:28:47 +00:00
2025-11-16 13:58:58 +01:00
< ? php if (( $this -> uri -> segment ( 1 ) == " awards " )) {
$colors = json_decode ( $user_map_custom ); ?>
< style >
. awardsBgSuccess {
background - color : < ? php echo $colors -> qsoconfirm -> color ; ?> !important;
}
. awardsBgWarning {
background - color : < ? php echo $colors -> qso -> color ; ?> !important;
}
</ style >
< ? php } ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/fontawesome/css/all.min.css'); ?> " >
2019-01-09 15:18:46 +00:00
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/jquery.fancybox.min.css'); ?> " />
2019-03-20 17:47:40 +00:00
2023-09-12 14:30:28 +01:00
<!-- Maps -->
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/js/leaflet/leaflet.css'); ?> " />
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/js/leaflet/Control.FullScreen.css'); ?> " />
2026-08-01 07:59:03 +00:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/js/leaflet/MarkerCluster.css'); ?> " />
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/js/leaflet/MarkerCluster.Default.css'); ?> " />
2019-03-20 16:58:06 +00:00
2023-09-12 14:30:28 +01:00
< ? php if ( $this -> uri -> segment ( 1 ) == " search " && $this -> uri -> segment ( 2 ) == " filter " ) { ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/query-builder.default.min.css'); ?> " />
2019-09-12 00:53:39 +01:00
< ? php } ?>
2019-10-05 21:57:44 +01:00
2025-10-08 23:33:55 +02:00
< ? php if (( $this -> uri -> segment ( 1 ) == " notes " && ( $this -> uri -> segment ( 2 ) == " add " || $this -> uri -> segment ( 2 ) == " edit " || $this -> uri -> segment ( 2 ) == " view " )) || $this -> uri -> segment ( 1 ) == " qso " ) { ?>
2025-02-25 15:34:39 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/plugins/easymde/easymde.css'); ?> " />
2020-05-24 22:40:37 +01:00
< ? php } ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/loading.min.css'); ?> " />
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/ldbtn.min.css'); ?> " />
2020-05-24 22:40:37 +01:00
2020-09-22 21:08:26 +02:00
2023-09-19 13:59:19 +02:00
< ? php if ( $this -> uri -> segment ( 1 ) == " sattimers " ) { ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " type = " text/css " href = " <?php echo $this->paths ->cache_buster('/assets/css/sattimers.css'); ?> " />
2023-09-19 13:59:19 +02:00
< ? php } ?>
2024-12-10 15:12:42 +01:00
< ? php if ( file_exists ( APPPATH . '../assets/css/custom.css' )) { ?>
2024-12-10 19:59:18 +01:00
< link rel = " stylesheet " href = " <?php echo $this->paths ->cache_buster('/assets/css/custom.css'); ?> " />
2024-12-10 15:12:42 +01:00
< ? php } ?>
2021-04-10 05:02:01 +02:00
2023-12-17 23:08:58 +01:00
< script >
2024-02-27 07:53:36 +00:00
var userName = '<?php echo $this->session->userdata(' user_name '); ?>' ;
< ? php
if ( $this -> uri -> segment ( 1 ) == " qso " ) {
2026-07-01 10:36:40 +02:00
$actstation = $this -> stations -> find_active () ? ? '' ;
echo " var activeStationId = ' " . $actstation . " '; \n " ;
$profile_info = $this -> stations -> profile ( $actstation ) -> row ();
echo " var activeStationTXPower = ' " . xss_clean ( $profile_info -> station_power ? ? 0 ) . " '; \n " ;
echo " var activeStationOP = ' " . xss_clean ( $this -> session -> userdata ( 'operator_callsign' )) . " '; \n " ;
echo " var last_qsos_count = " . $this -> session -> userdata ( 'qso_page_last_qso_count' ) . " \n " ;
2024-02-27 07:53:36 +00:00
}
?>
2023-12-17 23:08:58 +01:00
</ script >
2024-12-10 15:12:42 +01:00
< ? php if ( file_exists ( APPPATH . '../assets/js/sections/custom.js' )) { ?>
2024-12-10 19:59:18 +01:00
< script src = " <?php echo $this->paths ->cache_buster('/assets/js/sections/custom.js'); ?> " ></ script >
2024-12-10 15:12:42 +01:00
< ? php } ?>
2023-11-23 12:14:37 +01:00
2024-12-10 19:59:18 +01:00
< link rel = " icon " href = " <?php echo $this->paths ->cache_buster('/favicon.ico'); ?> " >
2019-05-21 14:00:39 +01:00
2023-09-12 14:30:28 +01:00
< title >< ? php if ( isset ( $page_title )) {
echo $page_title ;
2024-01-17 14:20:10 +00:00
} ?> - Wavelog</title>
2023-09-12 14:30:28 +01:00
</ head >
2019-01-09 15:18:46 +00:00
2026-07-03 07:06:44 +00:00
< body dir = " <?php echo $language['direction'] ; ?> " class = " <?= map_style_class(); ?> " >
2026-07-04 12:55:45 +00:00
< a class = " visually-hidden-focusable " href = " #main-content " >< ? = __ ( " Skip to content " ); ?> </a>
2024-02-08 10:51:43 +01:00
< nav class = " navbar navbar-expand-lg navbar-light bg-light main-nav " id = " header-menu " >
2023-09-12 14:30:28 +01:00
< div class = " container " >
2026-07-04 12:55:45 +00:00
< a class = " navbar-brand " href = " <?php echo site_url(); ?> " >< img class = " headerLogo " src = " <?php echo $this->paths ->cache_buster('/assets/logo/'. $this->optionslib ->get_logo('header_logo').'.png'); ?> " alt = " <?= __( " Wavelog home " ); ?> " /></ a >
2026-08-11 11:34:15 +02:00
< ? php if ( ENVIRONMENT == " development " || ( ENVIRONMENT == " docker " && ( $_ENV [ 'DOCKER_DEVELOPMENT' ] ? ? false ) == true )) { ?>
2025-01-02 10:22:23 +01:00
< span class = " badge text-bg-danger me-1 " >< ? = __ ( " Developer Mode " ); ?> </span>
2024-02-25 14:14:18 +01:00
< ? php } ?>
< ? php if ( ENVIRONMENT == " maintenance " ) { ?>
2025-01-02 10:22:23 +01:00
< span class = " badge text-bg-info me-1 " >< ? = __ ( " Maintenance Mode " ); ?> </span>
< ? php } ?>
< ? php if ( $this -> session -> userdata ( 'clubstation' ) == '1' && $this -> session -> userdata ( 'impersonate' ) == '1' ) { ?>
< span class = " badge text-bg-primary me-1 " >< ? = __ ( " Clubstation " ); ?> </span>
2024-02-25 14:14:18 +01:00
< ? php } ?>
2019-01-09 15:18:46 +00:00
2023-11-14 13:35:53 +01:00
< button class = " navbar-toggler " type = " button " data - bs - toggle = " collapse " data - bs - target = " #navbarNav " aria - controls = " navbarNav " aria - expanded = " false " aria - label = " Toggle navigation " >< span class = " navbar-toggler-icon " ></ span ></ button >
2021-02-12 23:27:08 +01:00
2023-09-12 14:30:28 +01:00
< div class = " collapse navbar-collapse " id = " navbarNav " >
2024-02-08 10:51:43 +01:00
< ul class = " navbar-nav navbar-nav-left " >
< li class = " nav-item dropdown " > <!-- LOGBOOK -->
2024-06-06 20:23:19 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " > < ? = __ ( " Logbook " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu header-dropdown " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('logbook'); ?> " >< i class = " fas fa-book " ></ i > < ? = __ ( " Overview " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('logbookadvanced'); ?> " >< i class = " fas fa-book-open " ></ i > < ? = __ ( " Advanced " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 05:29:15 +00:00
< ? php if ( ! ( $this -> config -> item ( 'disable_qsl' ) ? ? false )) { ?>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('qsl'); ?> " title = " QSL " >< i class = " fa fa-id-card " ></ i > < ? = __ ( " View QSL Cards " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 05:29:15 +00:00
< ? php } ?>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('eqsl'); ?> " title = " eQSL " >< i class = " fa fa-id-card " ></ i > < ? = __ ( " View eQSL Cards " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-07-09 06:08:09 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('generic_qsl/confirmations'); ?> " title = " eQSL " >< i class = " fa fa-id-card " ></ i > < ? = __ ( " View last confirmations " ); ?> </a></li>
2024-02-08 10:51:43 +01:00
</ ul >
2023-09-12 14:30:28 +01:00
</ li >
< ? php if (( $this -> config -> item ( 'use_auth' )) && ( $this -> session -> userdata ( 'user_type' ) >= 2 )) { ?>
2024-02-08 10:51:43 +01:00
< li class = " nav-item dropdown " > <!-- QSO -->
2024-06-06 20:23:19 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " QSO " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu header-dropdown " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('qso?manual=0'); ?> " title = " Log Live QSOs " >< i class = " fas fa-list " ></ i > < ? = __ ( " Live QSO " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('qso?manual=1'); ?> " title = " Log QSO made in the past " >< i class = " fas fa-list " ></ i > < ? = __ ( " Post QSO " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('simplefle'); ?> " title = " Simple Fast Log Entry " >< i class = " fas fa-list " ></ i > < ? = __ ( " Simple Fast Log Entry " ); ?> </a></li>
New Wavelog Contesting and Basics for Wavelog Worker (#3063)
* initial commit for new contesting in Wavelog
* implemented cache buster to match logic from upstream dev branch
* refactore data-store to idb since this will be much faster with a lot of QSOs (scale for the future)
* implementation of other exchange types (wip)
* updated migration version
* renamed mig
* renamed mig
* updated mig
* ESC Handler to reset form
* Add Websocket
* stretch maxDuration warning
We can stretch the maxDuration warning to 2 seconds to allow for more network latency and processing time. The heartbeat is protected against multiple parallel requests, so we can afford to be more lenient with the duration before showing a warning. This should help reduce false positives in environments with higher latency or slower processing.
* worked before warning in qso form
While input the logic checks in the qso list if the callisgn already exists on the same band and mode.
* translations
* fix band buttons
* updated migration after release 2.4.2
* Fixing create new contest, add clubstation permission check, add time check to contests
* Adding attach QSO to Contest
* Remove redundant clubstation checks
* Fix function tip
* Remove time check when launch contest
* Fixing contest attach main logbook, adding detach contest qso
* Enable clubstation contest QSO detach attach
* add space handler for callsign input
* set rst default to 599 for cw, 59 for others
* add grid and refactor some ui to make a better fitting here and there
* adjust tabindex
* add "copy exchange to" feature
* fix css for all themes
* adif and cbr export
* fix bug with wrong operator callsign
* add exchange type "exchange+grid"
* introduce new logic for exchangetypes and more flexible order selection
* fix broken qso list scroll
* legacy import feature
* more precise wording
* feat: inline editing of QSOs by double click in the QSO list
* redirect cabrillo to contesting manager
* Fix QSO permission check
* remove unused cabrillo stuff
* remove duplicate function
* fix check if worked before on band change
tnx to @int2001
* fix flash message for legacy importer
* make dropdown searchable and place "other" at the top
* add hint about "Other" contest
* avoid "flash" of winkeyer settings in qso logging, it shows up if cw is set as mode
* winkeyer for the new contesting
need proper testing by @AndreasK79 and @phl0 since I don't have a winkeyer myself. I tested with a python simulator...
* english comments
* proper singular/plural
* fix dropdown
* preselect active station location
* allow editing time aswell
* fix fontsize in radio buttons
* remove redundant qso count query
* cache last updated value for contest qsos to reduce db load
* index on user id
* cache also qso count
* you can now resize windows also on the edges
requested by @xyz667 in https://github.com/wavelog/wavelog/pull/3063#issuecomment-4557850867
* fix oversized clock
* click to prepare logging for contesting
Logic:
- if qso windows is open, call is sent to qso form
- if contest log is open, call is sent to contest log
- if both are open, call is sent to contest log
- if none is open, click opens qso form and call is sent to qso form
* handle exchange s prefill with data from the last qso and make exchange always uppercase
* add dropdown to qso list with option to delete qsos
* language fixes
* english comments
* center text
* fix missing dropdown on new qsos
* add date presets for contest session creator/editor
* basic worker implementation
* support multiple workers for clustering
* remove unnecessary node column
* simple availability check
* websocket for contesting
* bonus: add vip for visibilty in debug view
* use vip if available
* worker disabled in debug view if disabled in config
* racecondition for winkeyer breaks edit/delete dropdown
* racecondition for winkeyer breaks edit/delete dropdown
* qso handling for worker in contesting, no high interval heartbeat anymore
* clear heartbeat intervall
* fix some timing bugs
* remove dedicated worker controller as it's not needed
* handle whitespace
* trigger sync engine after processing QSO sync response and adjust last sync time to avoid spurious resyncs
* fix set and setLocal
* fix change detection and sync logic
* fix the lost of seconds due to edit
* fix table rendering
* watermark handling for true delta
* remove caching as it brings more problems here as benefits
* make serial as default exchangetype
* Add clarification on cluster setup requirements for worker URLs
* add operator to qso list if this is a clubstation
* fix bug for editing qsos in clubmode
* remove redundant code
* integers must be null in database
* fix bug in tabindex if 3 exchangefields are configured (serial, exchange, grid)
* nice contesting map (draft)
* map autofit
* add grid overlay
* calculate distanz and azimuth
* include rotor control via waveloggate (ws only)
* implement simple dedicated callbook lookup
* simpler and faster lookup
* option in contest session to disabled callbook lookup and only calculate dxcc
* syntax issue
* fix bug in CBR export
* catch empty result on contest
* remove some leftovers
* removed some comments
* remove unused stuff
* removed old todos/comments
* add 4s timeout for ajax transport
* you need to be admin for this
* translations
* add option to delete qso's aswell when deleting a session (opt in)
* add quickstart button in manager
* removed old todo
* fix "grows to bottom"
* disable "copy exchange to" if no exchange is set
* clear map on qso clear aswell
* same for scp
* updated documentation link
* calculate distanze and azimut also on grid only
* better space usage in qso input
* callbook db first approach, online lookup can be disabled while being cached for all users when enabled
* some input validation
* use only one sot for qrgtoband
* basic stats component
* fix html encoding
* render all aswell
* ascii
* store locally which time frame the user wants
* sync settings and warn user if something happend on the backend
* dev leftover
* show errors if callbook fails or callsign is invalid
* easier syntax
* Revert "easier syntax" - that was a mistake
This reverts commit 80c75dbf1e6c832f8d0616ea56b8b55d96c36418.
* fix for callbook lookup
* make pathline more visible
* better visibility of qsos
* add classic coordinates bar to the map
* fix bug in stats
* stretch max duration to 4s.. just in case
* simple sanity check in js to prevent unnecessary callbook lookups
* simulate tab after filling the call from scp
* fix poll radios with enabled worker
* reset po/mo files back to upstream/dev
* split contest exports, add back reg1test edi format
* keep the menu item but redirect to contesting
* better syntax and bugfix
* break it down further and fix typo ("constraint")
* use monospace font for input fields
* fix: in worker driven mode we need to do the heartbeat also on not focused windows otherwise we loose this contact
* fix: error handling on invalid times
* wavelog Ø
* more styling
* band lowercase fix
* Other is not a very descriptive title for a contest logger window, so we rename it to "Contest"
* custom contest name
* compare the whole array instead just a few settings
---------
Co-authored-by: int2001 <joerg@dj7nt.de>
Co-authored-by: HadleySo <71105018+HadleySo@users.noreply.github.com>
Co-authored-by: DB4SCW <dev@db4scw.de>
2026-06-14 14:23:00 +02:00
</ ul >
</ li >
< li class = " nav-item dropdown " > <!-- CONTEST -->
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " Contest " ); ?> </a>
< ul class = " dropdown-menu header-dropdown " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('contesting/quickstart'); ?> " target = " _blank " title = " <?= __( " Quick Start " ); ?> " >< i class = " fas fa-list " ></ i > < ? = __ ( " Quick Start " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
New Wavelog Contesting and Basics for Wavelog Worker (#3063)
* initial commit for new contesting in Wavelog
* implemented cache buster to match logic from upstream dev branch
* refactore data-store to idb since this will be much faster with a lot of QSOs (scale for the future)
* implementation of other exchange types (wip)
* updated migration version
* renamed mig
* renamed mig
* updated mig
* ESC Handler to reset form
* Add Websocket
* stretch maxDuration warning
We can stretch the maxDuration warning to 2 seconds to allow for more network latency and processing time. The heartbeat is protected against multiple parallel requests, so we can afford to be more lenient with the duration before showing a warning. This should help reduce false positives in environments with higher latency or slower processing.
* worked before warning in qso form
While input the logic checks in the qso list if the callisgn already exists on the same band and mode.
* translations
* fix band buttons
* updated migration after release 2.4.2
* Fixing create new contest, add clubstation permission check, add time check to contests
* Adding attach QSO to Contest
* Remove redundant clubstation checks
* Fix function tip
* Remove time check when launch contest
* Fixing contest attach main logbook, adding detach contest qso
* Enable clubstation contest QSO detach attach
* add space handler for callsign input
* set rst default to 599 for cw, 59 for others
* add grid and refactor some ui to make a better fitting here and there
* adjust tabindex
* add "copy exchange to" feature
* fix css for all themes
* adif and cbr export
* fix bug with wrong operator callsign
* add exchange type "exchange+grid"
* introduce new logic for exchangetypes and more flexible order selection
* fix broken qso list scroll
* legacy import feature
* more precise wording
* feat: inline editing of QSOs by double click in the QSO list
* redirect cabrillo to contesting manager
* Fix QSO permission check
* remove unused cabrillo stuff
* remove duplicate function
* fix check if worked before on band change
tnx to @int2001
* fix flash message for legacy importer
* make dropdown searchable and place "other" at the top
* add hint about "Other" contest
* avoid "flash" of winkeyer settings in qso logging, it shows up if cw is set as mode
* winkeyer for the new contesting
need proper testing by @AndreasK79 and @phl0 since I don't have a winkeyer myself. I tested with a python simulator...
* english comments
* proper singular/plural
* fix dropdown
* preselect active station location
* allow editing time aswell
* fix fontsize in radio buttons
* remove redundant qso count query
* cache last updated value for contest qsos to reduce db load
* index on user id
* cache also qso count
* you can now resize windows also on the edges
requested by @xyz667 in https://github.com/wavelog/wavelog/pull/3063#issuecomment-4557850867
* fix oversized clock
* click to prepare logging for contesting
Logic:
- if qso windows is open, call is sent to qso form
- if contest log is open, call is sent to contest log
- if both are open, call is sent to contest log
- if none is open, click opens qso form and call is sent to qso form
* handle exchange s prefill with data from the last qso and make exchange always uppercase
* add dropdown to qso list with option to delete qsos
* language fixes
* english comments
* center text
* fix missing dropdown on new qsos
* add date presets for contest session creator/editor
* basic worker implementation
* support multiple workers for clustering
* remove unnecessary node column
* simple availability check
* websocket for contesting
* bonus: add vip for visibilty in debug view
* use vip if available
* worker disabled in debug view if disabled in config
* racecondition for winkeyer breaks edit/delete dropdown
* racecondition for winkeyer breaks edit/delete dropdown
* qso handling for worker in contesting, no high interval heartbeat anymore
* clear heartbeat intervall
* fix some timing bugs
* remove dedicated worker controller as it's not needed
* handle whitespace
* trigger sync engine after processing QSO sync response and adjust last sync time to avoid spurious resyncs
* fix set and setLocal
* fix change detection and sync logic
* fix the lost of seconds due to edit
* fix table rendering
* watermark handling for true delta
* remove caching as it brings more problems here as benefits
* make serial as default exchangetype
* Add clarification on cluster setup requirements for worker URLs
* add operator to qso list if this is a clubstation
* fix bug for editing qsos in clubmode
* remove redundant code
* integers must be null in database
* fix bug in tabindex if 3 exchangefields are configured (serial, exchange, grid)
* nice contesting map (draft)
* map autofit
* add grid overlay
* calculate distanz and azimuth
* include rotor control via waveloggate (ws only)
* implement simple dedicated callbook lookup
* simpler and faster lookup
* option in contest session to disabled callbook lookup and only calculate dxcc
* syntax issue
* fix bug in CBR export
* catch empty result on contest
* remove some leftovers
* removed some comments
* remove unused stuff
* removed old todos/comments
* add 4s timeout for ajax transport
* you need to be admin for this
* translations
* add option to delete qso's aswell when deleting a session (opt in)
* add quickstart button in manager
* removed old todo
* fix "grows to bottom"
* disable "copy exchange to" if no exchange is set
* clear map on qso clear aswell
* same for scp
* updated documentation link
* calculate distanze and azimut also on grid only
* better space usage in qso input
* callbook db first approach, online lookup can be disabled while being cached for all users when enabled
* some input validation
* use only one sot for qrgtoband
* basic stats component
* fix html encoding
* render all aswell
* ascii
* store locally which time frame the user wants
* sync settings and warn user if something happend on the backend
* dev leftover
* show errors if callbook fails or callsign is invalid
* easier syntax
* Revert "easier syntax" - that was a mistake
This reverts commit 80c75dbf1e6c832f8d0616ea56b8b55d96c36418.
* fix for callbook lookup
* make pathline more visible
* better visibility of qsos
* add classic coordinates bar to the map
* fix bug in stats
* stretch max duration to 4s.. just in case
* simple sanity check in js to prevent unnecessary callbook lookups
* simulate tab after filling the call from scp
* fix poll radios with enabled worker
* reset po/mo files back to upstream/dev
* split contest exports, add back reg1test edi format
* keep the menu item but redirect to contesting
* better syntax and bugfix
* break it down further and fix typo ("constraint")
* use monospace font for input fields
* fix: in worker driven mode we need to do the heartbeat also on not focused windows otherwise we loose this contact
* fix: error handling on invalid times
* wavelog Ø
* more styling
* band lowercase fix
* Other is not a very descriptive title for a contest logger window, so we rename it to "Contest"
* custom contest name
* compare the whole array instead just a few settings
---------
Co-authored-by: int2001 <joerg@dj7nt.de>
Co-authored-by: HadleySo <71105018+HadleySo@users.noreply.github.com>
Co-authored-by: DB4SCW <dev@db4scw.de>
2026-06-14 14:23:00 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('contesting'); ?> " title = " <?= __( " Manage Contests " ); ?> " >< i class = " fas fa-list " ></ i > < ? = __ ( " Manage Contests " ); ?> </a></li>
2024-02-08 10:51:43 +01:00
</ ul >
2023-09-12 14:30:28 +01:00
</ li >
2024-02-08 10:51:43 +01:00
< ? php if ( $this -> session -> userdata ( 'user_show_notes' ) == 1 ) { ?> <!-- NOTES -->
2026-07-04 13:16:25 +00:00
< li class = " nav-item " >< a class = " nav-link " href = " <?php echo site_url('notes'); ?> " >< ? = __ ( " Notes " ); ?> </a></li>
2023-09-12 14:30:28 +01:00
< ? php } ?>
2024-02-08 10:51:43 +01:00
< li class = " nav-item dropdown " > <!-- ANALYTICS -->
2024-06-06 20:23:19 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " Analytics " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu header-dropdown " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('statistics'); ?> " title = " Statistics " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Statistics " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-11-25 00:05:28 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('statistics/antennaanalytics'); ?> " title = " Antenna Analytics " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Antenna Analytics " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-07-29 19:39:49 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('statistics/qslstats'); ?> " title = " QSL Statistics " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " QSL Statistics " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('gridmap'); ?> " title = " Gridmap " >< i class = " fas fa-globe-europe " ></ i > < ? = __ ( " Gridsquare Map " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('activated_gridmap'); ?> " title = " Activated Gridsquares " >< i class = " fas fa-globe-europe " ></ i > < ? = __ ( " Activated Gridsquares " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('activators'); ?> " title = " Gridsquare Activators " >< i class = " fas fa-globe-europe " ></ i > < ? = __ ( " Gridsquare Activators " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('distances'); ?> " title = " Distances " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Distances Worked " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-09-02 10:18:22 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('distancerecords'); ?> " title = " Satellite Distance records " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Satellite Distance Records " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('dayswithqso'); ?> " title = " Days with QSOs " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Days with QSOs " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('timeline'); ?> " title = " Timeline " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Timeline " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('accumulated'); ?> " title = " Accumulated Statistics " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Accumulated Statistics " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('timeplotter'); ?> " title = " View time when worked " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Timeplotter " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('continents'); ?> " title = " Continents " >< i class = " fas fa-globe-europe " ></ i > < ? = __ ( " Continents " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-19 15:33:26 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('callstats'); ?> " title = " Callsign Statistics " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " Callsign Statistics " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-05-26 12:36:40 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('statistics/initials'); ?> " title = " EME Initials " >< i class = " fas fa-chart-area " ></ i > < ? = __ ( " EME Initials " ); ?> </a></li>
2024-02-08 10:51:43 +01:00
</ ul >
2023-09-12 14:30:28 +01:00
</ li >
2024-02-08 10:51:43 +01:00
< li class = " nav-item dropdown " > <!-- AWARDS -->
2026-06-14 13:56:09 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " Awards " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu header-dropdown " >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " >< i class = " fas fa-globe " ></ i > < ? = __ ( " International " ); ?> </a>
2024-05-03 14:28:01 +02:00
< ul class = " submenu dropdown-menu " >
2025-04-09 09:36:53 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/cq'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " CQ WAZ " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/dxcc'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " DXCC " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/itu'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " ITU " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/sig'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " SIG " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/vucc'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " VUCC " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-03 09:53:26 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wae'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " Worked All Europe (WAE) " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-09-06 11:24:03 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wac'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " Worked All Continents (WAC) " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-09-27 12:09:09 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wpx'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " Worked All Prefixes (WPX) " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2026-08-02 07:03:05 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wwff'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " World Wide Flora Fauna (WWFF) " ); ?> </a></li>
2024-05-03 14:28:01 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-27 09:25:58 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " >< i class = " fas fa-satellite " ></ i > < ? = __ ( " Satellite " ); ?> </a>
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/seven3on73'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " 73 on 73 " ); ?> </a></li>
2026-05-21 09:40:40 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/amsat_rover'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " AMSAT Rover " ); ?> </a></li>
2025-02-27 09:25:58 +01:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " >< i class = " fas fa-trophy " ></ i > xOTA </ a >
2024-02-08 10:51:43 +01:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/sota'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " SOTA " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/iota'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " IOTA " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/pota'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " POTA " ); ?> </a></li>
2023-12-10 00:54:11 +01:00
</ ul >
2024-02-08 10:51:43 +01:00
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇨🇦 < ? = __ ( " Canada " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/rac'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " RAC " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-07-23 10:01:17 +08:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇨🇳 < ? = __ ( " China " ); ?> </a>
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wapc'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAPC " ); ?> </a></li>
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇩🇪 < ? = __ ( " Germany " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/dok'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " DOK " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/gridmaster/dl'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " DL Gridmaster " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇬🇧 < ? = __ ( " Great Britain " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wab'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAB " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2026-03-11 18:38:39 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇮🇹 < ? = __ ( " Italy " ); ?> </a>
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/waip'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAIP " ); ?> </a></li>
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇯🇵 < ? = __ ( " Japan " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/waja'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAJA " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/jcc'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " JCC " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/gridmaster/ja'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " JA Gridmaster " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇱🇺 < ? = __ ( " Luxemburg " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/gridmaster/lx'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " LX Gridmaster " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-11-16 14:15:26 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇵🇱 < ? = __ ( " Poland " ); ?> </a>
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/pl_polska'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " \" Polska \" Award " ); ?> </a></li>
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇨🇭 < ? = __ ( " Switzerland " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/helvetia'); ?> " >< i class = " fas fa-trophy " ></ i > H26 </ a ></ li >
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-05-21 23:47:57 +02:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇳🇱️ < ? = __ ( " The Netherlands " ); ?> </a>
< ul class = " submenu dropdown-menu " >
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/wap'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAP Worked All Provinces " ); ?> </a></li>
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " href = " # " > 🇺🇸 < ? = __ ( " USA " ); ?> </a>
2024-05-02 22:18:41 +02:00
< ul class = " submenu dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/counties'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " US Counties " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/was'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " WAS " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/gridmaster/us'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " US Gridmaster " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('awards/ffma'); ?> " >< i class = " fas fa-trophy " ></ i > < ? = __ ( " Fred Fish Memorial Award " ); ?> </a></li>
2024-05-02 22:18:41 +02:00
</ ul >
</ li >
2024-02-08 10:51:43 +01:00
</ ul >
2023-09-12 14:30:28 +01:00
</ li >
2024-02-08 10:51:43 +01:00
< li class = " nav-item dropdown " > <!-- TOOLS -->
2024-06-06 20:23:19 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " Tools " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu header-dropdown " >
2025-11-06 02:40:56 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('bandmap/list'); ?> " title = " DX Cluster " >< i class = " fa fa-tower-broadcast " ></ i > < ? = __ ( " DX Cluster " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('dxcalendar'); ?> " title = " DX Calendar " >< i class = " fas fa-calendar " ></ i > < ? = __ ( " DX Calendar " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('contestcalendar'); ?> " title = " Contest Calendar " >< i class = " fas fa-calendar " ></ i > < ? = __ ( " Contest Calendar " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-02-08 10:51:43 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('hamsat'); ?> " title = " Hams.at " >< i class = " fas fa-list " ></ i > Hams . at </ a ></ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('sattimers'); ?> " title = " SAT Timers " >< i class = " fas fa-satellite " ></ i > < ? = __ ( " SAT Timers " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2026-08-04 12:23:39 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('amsatstatus'); ?> " title = " AMSAT Satellite Status " >< i class = " fas fa-satellite-dish " ></ i > < ? = __ ( " AMSAT Satellite Status " ); ?> </a></li>
< li >< hr class = " dropdown-divider " ></ li >
2025-01-17 13:59:40 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('satellite/flightpath'); ?> " title = " Show Satellite Flight Path " >< i class = " fas fa-satellite " ></ i > < ? = __ ( " Satellite Flightpath " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-17 13:59:40 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('satellite/pass'); ?> " title = " Search for satellite passes " >< i class = " fas fa-satellite " ></ i > < ? = __ ( " Satellite Pass " ); ?> </a></li>
2026-07-26 19:46:16 +02:00
< li >< hr class = " dropdown-divider " ></ li >
2026-08-06 21:06:15 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('activationplanner'); ?> " title = " Plan an activation " >< i class = " fas fa-map-marked-alt " ></ i > < ? = __ ( " Activation Planner " ); ?> </a></li>
2024-02-08 10:51:43 +01:00
</ ul >
2023-10-09 11:03:16 +01:00
</ li >
2024-02-08 10:51:43 +01:00
< ? php } ?>
< ? php if (( $this -> config -> item ( 'use_auth' )) && ( $this -> session -> userdata ( 'user_type' ) == 99 )) { ?> <!-- ADMIN -->
< li class = " nav-item dropdown " >
2026-07-04 12:55:45 +00:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " title = " <?= __( " Admin " ); ?> " aria - label = " <?= __( " Admin " ); ?> " aria - haspopup = " true " >< i class = " fas fa-users-cog " aria - hidden = " true " ></ i ></ a >
2023-10-09 11:03:16 +01:00
2024-02-08 10:51:43 +01:00
< div class = " dropdown-menu header-dropdown " >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('user'); ?> " title = " Manage user accounts " >< i class = " fas fa-user " ></ i > < ? = __ ( " User Accounts " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('options'); ?> " title = " Manage global options " >< i class = " fas fa-cog " ></ i > < ? = __ ( " Global Options " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('mode'); ?> " title = " Manage QSO modes " >< i class = " fas fa-broadcast-tower " ></ i > < ? = __ ( " Modes " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
New Wavelog Contesting and Basics for Wavelog Worker (#3063)
* initial commit for new contesting in Wavelog
* implemented cache buster to match logic from upstream dev branch
* refactore data-store to idb since this will be much faster with a lot of QSOs (scale for the future)
* implementation of other exchange types (wip)
* updated migration version
* renamed mig
* renamed mig
* updated mig
* ESC Handler to reset form
* Add Websocket
* stretch maxDuration warning
We can stretch the maxDuration warning to 2 seconds to allow for more network latency and processing time. The heartbeat is protected against multiple parallel requests, so we can afford to be more lenient with the duration before showing a warning. This should help reduce false positives in environments with higher latency or slower processing.
* worked before warning in qso form
While input the logic checks in the qso list if the callisgn already exists on the same band and mode.
* translations
* fix band buttons
* updated migration after release 2.4.2
* Fixing create new contest, add clubstation permission check, add time check to contests
* Adding attach QSO to Contest
* Remove redundant clubstation checks
* Fix function tip
* Remove time check when launch contest
* Fixing contest attach main logbook, adding detach contest qso
* Enable clubstation contest QSO detach attach
* add space handler for callsign input
* set rst default to 599 for cw, 59 for others
* add grid and refactor some ui to make a better fitting here and there
* adjust tabindex
* add "copy exchange to" feature
* fix css for all themes
* adif and cbr export
* fix bug with wrong operator callsign
* add exchange type "exchange+grid"
* introduce new logic for exchangetypes and more flexible order selection
* fix broken qso list scroll
* legacy import feature
* more precise wording
* feat: inline editing of QSOs by double click in the QSO list
* redirect cabrillo to contesting manager
* Fix QSO permission check
* remove unused cabrillo stuff
* remove duplicate function
* fix check if worked before on band change
tnx to @int2001
* fix flash message for legacy importer
* make dropdown searchable and place "other" at the top
* add hint about "Other" contest
* avoid "flash" of winkeyer settings in qso logging, it shows up if cw is set as mode
* winkeyer for the new contesting
need proper testing by @AndreasK79 and @phl0 since I don't have a winkeyer myself. I tested with a python simulator...
* english comments
* proper singular/plural
* fix dropdown
* preselect active station location
* allow editing time aswell
* fix fontsize in radio buttons
* remove redundant qso count query
* cache last updated value for contest qsos to reduce db load
* index on user id
* cache also qso count
* you can now resize windows also on the edges
requested by @xyz667 in https://github.com/wavelog/wavelog/pull/3063#issuecomment-4557850867
* fix oversized clock
* click to prepare logging for contesting
Logic:
- if qso windows is open, call is sent to qso form
- if contest log is open, call is sent to contest log
- if both are open, call is sent to contest log
- if none is open, click opens qso form and call is sent to qso form
* handle exchange s prefill with data from the last qso and make exchange always uppercase
* add dropdown to qso list with option to delete qsos
* language fixes
* english comments
* center text
* fix missing dropdown on new qsos
* add date presets for contest session creator/editor
* basic worker implementation
* support multiple workers for clustering
* remove unnecessary node column
* simple availability check
* websocket for contesting
* bonus: add vip for visibilty in debug view
* use vip if available
* worker disabled in debug view if disabled in config
* racecondition for winkeyer breaks edit/delete dropdown
* racecondition for winkeyer breaks edit/delete dropdown
* qso handling for worker in contesting, no high interval heartbeat anymore
* clear heartbeat intervall
* fix some timing bugs
* remove dedicated worker controller as it's not needed
* handle whitespace
* trigger sync engine after processing QSO sync response and adjust last sync time to avoid spurious resyncs
* fix set and setLocal
* fix change detection and sync logic
* fix the lost of seconds due to edit
* fix table rendering
* watermark handling for true delta
* remove caching as it brings more problems here as benefits
* make serial as default exchangetype
* Add clarification on cluster setup requirements for worker URLs
* add operator to qso list if this is a clubstation
* fix bug for editing qsos in clubmode
* remove redundant code
* integers must be null in database
* fix bug in tabindex if 3 exchangefields are configured (serial, exchange, grid)
* nice contesting map (draft)
* map autofit
* add grid overlay
* calculate distanz and azimuth
* include rotor control via waveloggate (ws only)
* implement simple dedicated callbook lookup
* simpler and faster lookup
* option in contest session to disabled callbook lookup and only calculate dxcc
* syntax issue
* fix bug in CBR export
* catch empty result on contest
* remove some leftovers
* removed some comments
* remove unused stuff
* removed old todos/comments
* add 4s timeout for ajax transport
* you need to be admin for this
* translations
* add option to delete qso's aswell when deleting a session (opt in)
* add quickstart button in manager
* removed old todo
* fix "grows to bottom"
* disable "copy exchange to" if no exchange is set
* clear map on qso clear aswell
* same for scp
* updated documentation link
* calculate distanze and azimut also on grid only
* better space usage in qso input
* callbook db first approach, online lookup can be disabled while being cached for all users when enabled
* some input validation
* use only one sot for qrgtoband
* basic stats component
* fix html encoding
* render all aswell
* ascii
* store locally which time frame the user wants
* sync settings and warn user if something happend on the backend
* dev leftover
* show errors if callbook fails or callsign is invalid
* easier syntax
* Revert "easier syntax" - that was a mistake
This reverts commit 80c75dbf1e6c832f8d0616ea56b8b55d96c36418.
* fix for callbook lookup
* make pathline more visible
* better visibility of qsos
* add classic coordinates bar to the map
* fix bug in stats
* stretch max duration to 4s.. just in case
* simple sanity check in js to prevent unnecessary callbook lookups
* simulate tab after filling the call from scp
* fix poll radios with enabled worker
* reset po/mo files back to upstream/dev
* split contest exports, add back reg1test edi format
* keep the menu item but redirect to contesting
* better syntax and bugfix
* break it down further and fix typo ("constraint")
* use monospace font for input fields
* fix: in worker driven mode we need to do the heartbeat also on not focused windows otherwise we loose this contact
* fix: error handling on invalid times
* wavelog Ø
* more styling
* band lowercase fix
* Other is not a very descriptive title for a contest logger window, so we rename it to "Contest"
* custom contest name
* compare the whole array instead just a few settings
---------
Co-authored-by: int2001 <joerg@dj7nt.de>
Co-authored-by: HadleySo <71105018+HadleySo@users.noreply.github.com>
Co-authored-by: DB4SCW <dev@db4scw.de>
2026-06-14 14:23:00 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('contest_admin/add'); ?> " title = " Manage Contest names " >< i class = " fas fa-broadcast-tower " ></ i > < ? = __ ( " Contests " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('satellite'); ?> " title = " Manage Satellites " >< i class = " fas fa-satellite " ></ i > < ? = __ ( " Satellites " ); ?> </a>
2024-03-11 15:15:01 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('themes'); ?> " title = " Manage Themes " >< i class = " fas fa-cog " ></ i > < ? = __ ( " Themes " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('backup'); ?> " title = " Backup Wavelog content " >< i class = " fas fa-save " ></ i > < ? = __ ( " Backup " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('update'); ?> " title = " Update Country Files " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Update Country Files " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-divider " ></ div >
2024-06-07 14:58:23 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('cron'); ?> " title = " Cron Manager " >< i class = " fas fa-clock " ></ i > < ? = __ ( " Cron Manager " ); ?> </a>
2024-04-22 14:24:04 +02:00
< div class = " dropdown-divider " ></ div >
2024-06-06 20:23:19 +02:00
< a class = " dropdown-item " href = " <?php echo site_url('debug'); ?> " title = " Debug Information " >< i class = " fas fa-tools " ></ i > < ? = __ ( " Debug Information " ); ?> </a>
2024-02-08 10:51:43 +01:00
</ div >
</ li >
2023-09-12 14:30:28 +01:00
< ? php } ?>
</ ul >
2024-02-08 10:51:43 +01:00
< ul class = " navbar-nav navbar-nav-right " >
< ? php if ( $this -> session -> userdata ( 'user_quicklog' ) == 1 ) { ?> <!-- QUICKLOG/SEARCHBAR -->
2023-11-05 12:30:33 +01:00
< script >
2024-02-08 10:51:43 +01:00
function submitForm ( action ) {
var form = document . getElementById ( 'quicklog-form' );
var input = document . getElementById ( 'quicklog-input' );
if ( action === 'search' ) {
form . action = " <?php echo site_url('search'); ?> " ;
form . method = " post " ;
2023-11-05 12:30:33 +01:00
}
2024-02-08 10:51:43 +01:00
form . submit ();
2023-11-05 12:30:33 +01:00
}
2024-02-08 10:51:43 +01:00
function logQuicklog () {
if ( localStorage . getItem ( " quicklogCallsign " ) !== " " ) {
localStorage . removeItem ( " quicklogCallsign " );
2023-11-05 12:30:33 +01:00
}
2024-02-08 10:51:43 +01:00
localStorage . setItem ( " quicklogCallsign " , $ ( " input[name='callsign'] " ) . val ());
window . open ( " <?php echo site_url('qso?manual=0'); ?> " , " _self " );
2023-11-05 12:30:33 +01:00
}
</ script >
2024-02-08 10:51:43 +01:00
< ? php if ( $this -> session -> userdata ( 'user_quicklog_enter' ) == 1 ) { ?>
< script >
function handleKeyPress ( event ) {
if ( event . key === 'Enter' ) {
submitForm ( 'search' ); // Treat Enter key press as clicking the 'quicksearch-search' button
}
}
</ script >
< ? php } else { ?>
< script >
function handleKeyPress ( event ) {
if ( event . key === 'Enter' ) {
logQuicklog (); // Treat Enter key press as clicking the 'quicksearch-log' button
}
}
</ script >
< ? php } ?>
< form id = " quicklog-form " class = " d-flex align-items-center me-3 " onsubmit = " return false; " >
< div class = " input-group " >
2024-06-06 20:23:19 +02:00
< input class = " form-control border " id = " nav-bar-search-input " type = " text " name = " callsign " placeholder = " <?= __( " Add / Search Callsign " ); ?> " aria - label = " Quicklog " onkeypress = " handleKeyPress(event) " >
2024-02-08 10:51:43 +01:00
2026-07-04 13:16:25 +00:00
< button title = " <?= __( " Log " ); ?> " aria - label = " <?= __( " Log " ); ?> " class = " btn btn-outline-success border " type = " button " onclick = " logQuicklog() " >< i class = " fas fa-plus " aria - hidden = " true " ></ i ></ button >
< button title = " <?= __( " Search " ); ?> " aria - label = " <?= __( " Search " ); ?> " class = " btn btn-outline-success border " type = " button " onclick = " submitForm('search') " >< i class = " fas fa-search " aria - hidden = " true " ></ i ></ button >
2024-02-08 10:51:43 +01:00
</ div >
</ form >
< ? php } else { ?>
< form id = " searchbar-form " method = " post " class = " d-flex align-items-center me-2 " action = " <?php echo site_url('search'); ?> " >
< div class = " input-group " >
2024-06-06 20:23:19 +02:00
< input class = " form-control border " id = " nav-bar-search-input " type = " search " name = " callsign " placeholder = " <?= __( " Search Callsign " ); ?> " aria - label = " Search " >
2026-07-04 13:16:25 +00:00
< button title = " <?= __( " Search " ); ?> " aria - label = " <?= __( " Search " ); ?> " class = " btn btn-outline-success border " type = " submit " >< i class = " fas fa-search " aria - hidden = " true " ></ i ></ button >
2024-02-08 10:51:43 +01:00
</ div >
</ form >
2023-11-05 12:30:33 +01:00
< ? php } ?>
2024-02-08 10:51:43 +01:00
< ? php if (( $this -> config -> item ( 'use_auth' )) && ( $this -> session -> userdata ( 'user_type' ) >= 2 )) { ?>
<!-- Logged in Content -->
< ? php } else { ?>
<!-- Not Logged In -->
< form method = " post " action = " <?php echo site_url('user/login'); ?> " style = " padding-left: 5px; " class = " form-inline " >
< input class = " form-control me-sm-2 " type = " text " name = " user_name " placeholder = " Username " aria - label = " Username " >
< input class = " form-control me-sm-2 " type = " password " name = " user_password " placeholder = " Password " aria - label = " Password " >
< input type = " hidden " name = " id " value = " <?php echo $this->uri ->segment(3); ?> " />
2024-06-06 20:23:19 +02:00
< button class = " btn btn-outline-success me-sm-2 " type = " submit " >< ? = __ ( " Login " ); ?> </button>
2024-02-08 10:51:43 +01:00
</ form >
< ? php } ?>
2026-07-01 10:36:40 +02:00
< ? php $quick_theme_switcher = ( $this -> user_options_model -> get_options ( 'header_menu' , array ( 'option_name' => 'quick_theme_switcher' )) -> row () -> option_value ? ? 'true' ) === 'true' ? 'true' : 'false' ;
if (( $this -> config -> item ( 'use_auth' )) && ( $this -> session -> userdata ( 'user_type' ) >= 2 )) {
if ( $quick_theme_switcher === 'true' ) {
// Quick theme switcher — list every installed theme so the user can
// change skin straight from the header without opening their settings.
$qts = $this -> user_model -> getUserThemes ();
$qts_current = $qts [ 'current' ];
$qts_themes = $qts [ 'themes' ];
?>
<!-- Quick Theme Switcher -->
< li class = " nav-item dropdown " >
2026-07-04 12:55:45 +00:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " title = " <?= __( " Themes " ); ?> " aria - label = " <?= __( " Themes " ); ?> " aria - haspopup = " true " >< i class = " fas fa-palette " aria - hidden = " true " ></ i ></ a >
2026-07-01 10:36:40 +02:00
< ul class = " dropdown-menu dropdown-menu-right header-dropdown " >
< li >< span class = " dropdown-item-text fw-bold " >< ? = __ ( " Themes " ); ?> </span></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2026-07-01 10:36:40 +02:00
< ? php foreach ( $qts_themes as $qts_t ) { ?>
< li >
< button type = " button " class = " dropdown-item d-flex justify-content-between align-items-center " onclick = " quick_switch_theme('<?php echo xss_clean( $qts_t->foldername ); ?>') " >
< span >
< ? php if ( $qts_t -> foldername == $qts_current ) { ?>
< i class = " fas fa-check text-success me-2 " ></ i >
< ? php } else { ?>
< i class = " far fa-circle me-2 " ></ i >
< ? php } ?>
< ? php echo htmlspecialchars ( $qts_t -> name , ENT_QUOTES , 'UTF-8' ); ?>
</ span >
< ? php if ( ! empty ( $qts_t -> theme_mode )) { ?>
< small class = " text-muted ms-3 text-capitalize " >< ? php echo $qts_t -> theme_mode ; ?> </small>
2026-06-14 15:19:02 +02:00
< ? php } ?>
2026-07-01 10:36:40 +02:00
</ button >
</ li >
< ? php } ?>
</ ul >
</ li >
< ? php } ?>
2026-06-14 15:19:02 +02:00
2023-09-12 14:30:28 +01:00
<!-- Logged in As -->
< li class = " nav-item dropdown " >
2025-01-02 10:22:23 +01:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >
< ? php if ( $this -> session -> userdata ( 'clubstation' ) == 1 ) {
2026-08-12 07:52:58 +00:00
echo '<i class="fas fa-users"></i> '
. '<b class="callsign">' . strtoupper ( $this -> session -> userdata ( 'user_callsign' )) . '</b>'
. ' <br><small>'
. sprintf ( _pgettext ( " Operator: Callsign " , " Op: %s " ), '<span class="callsign">' . strtoupper ( $this -> session -> userdata ( 'operator_callsign' )) . '</span>' )
. '</small>' ;
} else {
echo '<i class="fas fa-user"></i> <span class="callsign">' . strtoupper ( $this -> session -> userdata ( 'user_callsign' )) . '</span>' ;
} ?>
2025-01-02 10:22:23 +01:00
</ a >
2023-09-12 14:30:28 +01:00
2024-02-08 10:51:43 +01:00
< ul class = " dropdown-menu dropdown-menu-right header-dropdown " >
2025-01-02 10:22:23 +01:00
< ? php if ( clubaccess_check ( 9 )) { ?> <!-- Club Access Check -->
2024-06-26 00:46:25 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('user/edit') . " / " . $this->session ->userdata('user_id'); ?> " title = " Account " >< i class = " fas fa-user " ></ i > < ? = __ ( " Account " ); ?> </a></li>
2024-02-09 11:05:28 +01:00
< ? php
$quickswitch_enabled = ( $this -> user_options_model -> get_options ( 'header_menu' , array ( 'option_name' => 'locations_quickswitch' )) -> row () -> option_value ? ? 'false' );
?>
2026-06-28 09:32:58 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('stationsetup'); ?> " title = " Manage station setup " >< i class = " fas fa-home " ></ i > < ? = __ ( " Station Setup " ); ?> </a></li>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('band'); ?> " title = " Manage Bands " >< i class = " fas fa-cog " ></ i > < ? = __ ( " Bands " ); ?> </a></li>
2025-07-05 07:56:31 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('band/edges'); ?> " title = " Manage Band Edgeds " >< i class = " fas fa-cog " ></ i > < ? = __ ( " Band Edges " ); ?> </a></li>
2025-06-25 05:33:32 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('usermode'); ?> " title = " Manage Modes " >< i class = " fas fa-cog " ></ i > < ? = __ ( " Modes " ); ?> </a></li>
2024-03-11 15:15:01 +01:00
2025-01-02 10:22:23 +01:00
< ? php if ( $this -> config -> item ( 'special_callsign' ) && $this -> session -> userdata ( 'clubstation' ) == 0 ) { ?>
< ? php if ( ! empty ( $this -> session -> userdata ( 'available_clubstations' ))) { ?>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-02 10:22:23 +01:00
< li >< a class = " dropdown-item disabled " >< ? = __ ( " Switch to Clubstation: " ); ?> </a></li>
< ? php foreach ( $this -> session -> userdata ( 'available_clubstations' ) as $clubstation ) { ?>
< li >
< div class = " btn-group w-100 " role = " group " >
< button class = " dropdown-item text-start " style = " flex: 1; " title = " <?= sprintf(__( " Switch to % s " ), $clubstation->user_callsign ); ?> " onclick = " clubswitch_modal('<?php echo $clubstation->user_id ; ?>', '<?php echo $clubstation->user_callsign ; ?>') " >
2026-08-13 10:40:39 +00:00
< i class = " fas fa-exchange-alt " ></ i > < span class = " callsign " >< ? php echo $clubstation -> user_callsign ; ?> </span>
2025-01-02 10:22:23 +01:00
</ button >
< ? php if ( $clubstation -> p_level >= 9 || $this -> session -> userdata ( 'user_type' ) == 99 ) { ?>
2026-07-04 13:16:25 +00:00
< a class = " dropdown-item text-end " style = " flex: 0 0 50px; " title = " <?= sprintf(_pgettext( " Managing a Club Callsign " , " Manage % s " ), $clubstation->user_callsign ); ?> " aria - label = " <?= sprintf(_pgettext( " Managing a Club Callsign " , " Manage % s " ), $clubstation->user_callsign ); ?> " href = " <?php echo site_url('club/permissions/' . $clubstation->user_id ); ?> " >
2025-01-02 10:22:23 +01:00
< i class = " fas fa-cogs " ></ i >
</ a >
< ? php } ?>
</ div >
2025-01-19 15:33:26 +01:00
</ li >
2025-01-02 10:22:23 +01:00
< ? php } ?>
2025-01-07 05:57:36 +01:00
< ? php } else if ( $this -> session -> userdata ( 'user_type' ) === '99' ) { ?>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-02 10:22:23 +01:00
< li >< a class = " dropdown-item disabled " >< ? = __ ( " No Clubstations available " ); ?> </a></li>
< ? php } ?>
< ? php } ?>
2019-09-11 17:32:40 +01:00
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2021-02-12 23:27:08 +01:00
2025-12-08 06:10:39 +00:00
< ? php } if (( clubaccess_check ( 3 ) || clubaccess_check ( 3 )) && ! ( clubaccess_check ( 9 ))) { ?> <!-- Club Access Check -->
< li >< a class = " dropdown-item " href = " <?php echo site_url('stationsetup/list_locations'); ?> " title = " Manage station setup " >< i class = " fas fa-home " ></ i > < ? = __ ( " Station Setup " ); ?> </a></li>
2025-11-30 08:13:53 +00:00
< ? php } if ( clubaccess_check ( 6 ) || clubaccess_check ( 9 )) { ?> <!-- Club Access Check -->
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('adif'); ?> " title = " Amateur Data Interchange Format (ADIF) import / export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " ADIF Import / Export " ); ?> </a></li>
2025-11-30 08:13:53 +00:00
< ? php } if ( clubaccess_check ( 9 )) { ?> <!-- Club Access Check -->
2021-02-12 23:27:08 +01:00
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Other Export Options " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " submenu submenu-left dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('kmlexport'); ?> " title = " KML Export for Google Earth " >< i class = " fas fa-sync " ></ i > < ? = __ ( " KML Export " ); ?> </a></li>
2023-03-17 17:54:35 +00:00
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('dxatlas'); ?> " title = " DX Atlas Gridsquare Export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " DX Atlas Gridsquare Export " ); ?> </a></li>
2021-03-14 10:11:21 +01:00
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('csv'); ?> " title = " SOTA CSV Export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " SOTA CSV Export " ); ?> </a></li>
2022-09-19 16:34:13 +02:00
New Wavelog Contesting and Basics for Wavelog Worker (#3063)
* initial commit for new contesting in Wavelog
* implemented cache buster to match logic from upstream dev branch
* refactore data-store to idb since this will be much faster with a lot of QSOs (scale for the future)
* implementation of other exchange types (wip)
* updated migration version
* renamed mig
* renamed mig
* updated mig
* ESC Handler to reset form
* Add Websocket
* stretch maxDuration warning
We can stretch the maxDuration warning to 2 seconds to allow for more network latency and processing time. The heartbeat is protected against multiple parallel requests, so we can afford to be more lenient with the duration before showing a warning. This should help reduce false positives in environments with higher latency or slower processing.
* worked before warning in qso form
While input the logic checks in the qso list if the callisgn already exists on the same band and mode.
* translations
* fix band buttons
* updated migration after release 2.4.2
* Fixing create new contest, add clubstation permission check, add time check to contests
* Adding attach QSO to Contest
* Remove redundant clubstation checks
* Fix function tip
* Remove time check when launch contest
* Fixing contest attach main logbook, adding detach contest qso
* Enable clubstation contest QSO detach attach
* add space handler for callsign input
* set rst default to 599 for cw, 59 for others
* add grid and refactor some ui to make a better fitting here and there
* adjust tabindex
* add "copy exchange to" feature
* fix css for all themes
* adif and cbr export
* fix bug with wrong operator callsign
* add exchange type "exchange+grid"
* introduce new logic for exchangetypes and more flexible order selection
* fix broken qso list scroll
* legacy import feature
* more precise wording
* feat: inline editing of QSOs by double click in the QSO list
* redirect cabrillo to contesting manager
* Fix QSO permission check
* remove unused cabrillo stuff
* remove duplicate function
* fix check if worked before on band change
tnx to @int2001
* fix flash message for legacy importer
* make dropdown searchable and place "other" at the top
* add hint about "Other" contest
* avoid "flash" of winkeyer settings in qso logging, it shows up if cw is set as mode
* winkeyer for the new contesting
need proper testing by @AndreasK79 and @phl0 since I don't have a winkeyer myself. I tested with a python simulator...
* english comments
* proper singular/plural
* fix dropdown
* preselect active station location
* allow editing time aswell
* fix fontsize in radio buttons
* remove redundant qso count query
* cache last updated value for contest qsos to reduce db load
* index on user id
* cache also qso count
* you can now resize windows also on the edges
requested by @xyz667 in https://github.com/wavelog/wavelog/pull/3063#issuecomment-4557850867
* fix oversized clock
* click to prepare logging for contesting
Logic:
- if qso windows is open, call is sent to qso form
- if contest log is open, call is sent to contest log
- if both are open, call is sent to contest log
- if none is open, click opens qso form and call is sent to qso form
* handle exchange s prefill with data from the last qso and make exchange always uppercase
* add dropdown to qso list with option to delete qsos
* language fixes
* english comments
* center text
* fix missing dropdown on new qsos
* add date presets for contest session creator/editor
* basic worker implementation
* support multiple workers for clustering
* remove unnecessary node column
* simple availability check
* websocket for contesting
* bonus: add vip for visibilty in debug view
* use vip if available
* worker disabled in debug view if disabled in config
* racecondition for winkeyer breaks edit/delete dropdown
* racecondition for winkeyer breaks edit/delete dropdown
* qso handling for worker in contesting, no high interval heartbeat anymore
* clear heartbeat intervall
* fix some timing bugs
* remove dedicated worker controller as it's not needed
* handle whitespace
* trigger sync engine after processing QSO sync response and adjust last sync time to avoid spurious resyncs
* fix set and setLocal
* fix change detection and sync logic
* fix the lost of seconds due to edit
* fix table rendering
* watermark handling for true delta
* remove caching as it brings more problems here as benefits
* make serial as default exchangetype
* Add clarification on cluster setup requirements for worker URLs
* add operator to qso list if this is a clubstation
* fix bug for editing qsos in clubmode
* remove redundant code
* integers must be null in database
* fix bug in tabindex if 3 exchangefields are configured (serial, exchange, grid)
* nice contesting map (draft)
* map autofit
* add grid overlay
* calculate distanz and azimuth
* include rotor control via waveloggate (ws only)
* implement simple dedicated callbook lookup
* simpler and faster lookup
* option in contest session to disabled callbook lookup and only calculate dxcc
* syntax issue
* fix bug in CBR export
* catch empty result on contest
* remove some leftovers
* removed some comments
* remove unused stuff
* removed old todos/comments
* add 4s timeout for ajax transport
* you need to be admin for this
* translations
* add option to delete qso's aswell when deleting a session (opt in)
* add quickstart button in manager
* removed old todo
* fix "grows to bottom"
* disable "copy exchange to" if no exchange is set
* clear map on qso clear aswell
* same for scp
* updated documentation link
* calculate distanze and azimut also on grid only
* better space usage in qso input
* callbook db first approach, online lookup can be disabled while being cached for all users when enabled
* some input validation
* use only one sot for qrgtoband
* basic stats component
* fix html encoding
* render all aswell
* ascii
* store locally which time frame the user wants
* sync settings and warn user if something happend on the backend
* dev leftover
* show errors if callbook fails or callsign is invalid
* easier syntax
* Revert "easier syntax" - that was a mistake
This reverts commit 80c75dbf1e6c832f8d0616ea56b8b55d96c36418.
* fix for callbook lookup
* make pathline more visible
* better visibility of qsos
* add classic coordinates bar to the map
* fix bug in stats
* stretch max duration to 4s.. just in case
* simple sanity check in js to prevent unnecessary callbook lookups
* simulate tab after filling the call from scp
* fix poll radios with enabled worker
* reset po/mo files back to upstream/dev
* split contest exports, add back reg1test edi format
* keep the menu item but redirect to contesting
* better syntax and bugfix
* break it down further and fix typo ("constraint")
* use monospace font for input fields
* fix: in worker driven mode we need to do the heartbeat also on not focused windows otherwise we loose this contact
* fix: error handling on invalid times
* wavelog Ø
* more styling
* band lowercase fix
* Other is not a very descriptive title for a contest logger window, so we rename it to "Contest"
* custom contest name
* compare the whole array instead just a few settings
---------
Co-authored-by: int2001 <joerg@dj7nt.de>
Co-authored-by: HadleySo <71105018+HadleySo@users.noreply.github.com>
Co-authored-by: DB4SCW <dev@db4scw.de>
2026-06-14 14:23:00 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('contesting'); ?> " title = " Cabrillo Export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Cabrillo Export " ); ?> </a></li>
2024-02-09 15:40:40 +01:00
New Wavelog Contesting and Basics for Wavelog Worker (#3063)
* initial commit for new contesting in Wavelog
* implemented cache buster to match logic from upstream dev branch
* refactore data-store to idb since this will be much faster with a lot of QSOs (scale for the future)
* implementation of other exchange types (wip)
* updated migration version
* renamed mig
* renamed mig
* updated mig
* ESC Handler to reset form
* Add Websocket
* stretch maxDuration warning
We can stretch the maxDuration warning to 2 seconds to allow for more network latency and processing time. The heartbeat is protected against multiple parallel requests, so we can afford to be more lenient with the duration before showing a warning. This should help reduce false positives in environments with higher latency or slower processing.
* worked before warning in qso form
While input the logic checks in the qso list if the callisgn already exists on the same band and mode.
* translations
* fix band buttons
* updated migration after release 2.4.2
* Fixing create new contest, add clubstation permission check, add time check to contests
* Adding attach QSO to Contest
* Remove redundant clubstation checks
* Fix function tip
* Remove time check when launch contest
* Fixing contest attach main logbook, adding detach contest qso
* Enable clubstation contest QSO detach attach
* add space handler for callsign input
* set rst default to 599 for cw, 59 for others
* add grid and refactor some ui to make a better fitting here and there
* adjust tabindex
* add "copy exchange to" feature
* fix css for all themes
* adif and cbr export
* fix bug with wrong operator callsign
* add exchange type "exchange+grid"
* introduce new logic for exchangetypes and more flexible order selection
* fix broken qso list scroll
* legacy import feature
* more precise wording
* feat: inline editing of QSOs by double click in the QSO list
* redirect cabrillo to contesting manager
* Fix QSO permission check
* remove unused cabrillo stuff
* remove duplicate function
* fix check if worked before on band change
tnx to @int2001
* fix flash message for legacy importer
* make dropdown searchable and place "other" at the top
* add hint about "Other" contest
* avoid "flash" of winkeyer settings in qso logging, it shows up if cw is set as mode
* winkeyer for the new contesting
need proper testing by @AndreasK79 and @phl0 since I don't have a winkeyer myself. I tested with a python simulator...
* english comments
* proper singular/plural
* fix dropdown
* preselect active station location
* allow editing time aswell
* fix fontsize in radio buttons
* remove redundant qso count query
* cache last updated value for contest qsos to reduce db load
* index on user id
* cache also qso count
* you can now resize windows also on the edges
requested by @xyz667 in https://github.com/wavelog/wavelog/pull/3063#issuecomment-4557850867
* fix oversized clock
* click to prepare logging for contesting
Logic:
- if qso windows is open, call is sent to qso form
- if contest log is open, call is sent to contest log
- if both are open, call is sent to contest log
- if none is open, click opens qso form and call is sent to qso form
* handle exchange s prefill with data from the last qso and make exchange always uppercase
* add dropdown to qso list with option to delete qsos
* language fixes
* english comments
* center text
* fix missing dropdown on new qsos
* add date presets for contest session creator/editor
* basic worker implementation
* support multiple workers for clustering
* remove unnecessary node column
* simple availability check
* websocket for contesting
* bonus: add vip for visibilty in debug view
* use vip if available
* worker disabled in debug view if disabled in config
* racecondition for winkeyer breaks edit/delete dropdown
* racecondition for winkeyer breaks edit/delete dropdown
* qso handling for worker in contesting, no high interval heartbeat anymore
* clear heartbeat intervall
* fix some timing bugs
* remove dedicated worker controller as it's not needed
* handle whitespace
* trigger sync engine after processing QSO sync response and adjust last sync time to avoid spurious resyncs
* fix set and setLocal
* fix change detection and sync logic
* fix the lost of seconds due to edit
* fix table rendering
* watermark handling for true delta
* remove caching as it brings more problems here as benefits
* make serial as default exchangetype
* Add clarification on cluster setup requirements for worker URLs
* add operator to qso list if this is a clubstation
* fix bug for editing qsos in clubmode
* remove redundant code
* integers must be null in database
* fix bug in tabindex if 3 exchangefields are configured (serial, exchange, grid)
* nice contesting map (draft)
* map autofit
* add grid overlay
* calculate distanz and azimuth
* include rotor control via waveloggate (ws only)
* implement simple dedicated callbook lookup
* simpler and faster lookup
* option in contest session to disabled callbook lookup and only calculate dxcc
* syntax issue
* fix bug in CBR export
* catch empty result on contest
* remove some leftovers
* removed some comments
* remove unused stuff
* removed old todos/comments
* add 4s timeout for ajax transport
* you need to be admin for this
* translations
* add option to delete qso's aswell when deleting a session (opt in)
* add quickstart button in manager
* removed old todo
* fix "grows to bottom"
* disable "copy exchange to" if no exchange is set
* clear map on qso clear aswell
* same for scp
* updated documentation link
* calculate distanze and azimut also on grid only
* better space usage in qso input
* callbook db first approach, online lookup can be disabled while being cached for all users when enabled
* some input validation
* use only one sot for qrgtoband
* basic stats component
* fix html encoding
* render all aswell
* ascii
* store locally which time frame the user wants
* sync settings and warn user if something happend on the backend
* dev leftover
* show errors if callbook fails or callsign is invalid
* easier syntax
* Revert "easier syntax" - that was a mistake
This reverts commit 80c75dbf1e6c832f8d0616ea56b8b55d96c36418.
* fix for callbook lookup
* make pathline more visible
* better visibility of qsos
* add classic coordinates bar to the map
* fix bug in stats
* stretch max duration to 4s.. just in case
* simple sanity check in js to prevent unnecessary callbook lookups
* simulate tab after filling the call from scp
* fix poll radios with enabled worker
* reset po/mo files back to upstream/dev
* split contest exports, add back reg1test edi format
* keep the menu item but redirect to contesting
* better syntax and bugfix
* break it down further and fix typo ("constraint")
* use monospace font for input fields
* fix: in worker driven mode we need to do the heartbeat also on not focused windows otherwise we loose this contact
* fix: error handling on invalid times
* wavelog Ø
* more styling
* band lowercase fix
* Other is not a very descriptive title for a contest logger window, so we rename it to "Contest"
* custom contest name
* compare the whole array instead just a few settings
---------
Co-authored-by: int2001 <joerg@dj7nt.de>
Co-authored-by: HadleySo <71105018+HadleySo@users.noreply.github.com>
Co-authored-by: DB4SCW <dev@db4scw.de>
2026-06-14 14:23:00 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('contesting'); ?> " title = " EDI Export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " EDI Export " ); ?> </a></li>
2023-12-12 16:27:41 +00:00
</ ul >
2024-02-08 10:51:43 +01:00
</ li >
2021-03-12 16:22:40 +00:00
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2021-03-12 16:22:40 +00:00
2023-09-12 14:30:28 +01:00
< ? php
2024-02-09 11:05:28 +01:00
$logbooks_locations_array = $this -> logbooks_model -> list_logbook_relationships ( $this -> session -> userdata ( 'active_station_logbook' ));
2026-03-18 09:00:48 +01:00
if ( $logbooks_locations_array [ 0 ] !== - 1 ) {
2023-09-12 14:30:28 +01:00
$location_list = " ' " . implode ( " ',' " , $logbooks_locations_array ) . " ' " ;
} else {
$location_list = null ;
}
2021-03-12 16:22:40 +00:00
2024-06-13 14:39:47 +02:00
if ( ! ( $this -> config -> item ( 'disable_oqrs' ) ? ? false )) {
2024-07-11 18:30:46 +00:00
$oqrs_requests = $this -> oqrs_model -> oqrs_requests ( $location_list );
?>
2024-07-29 19:39:49 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('oqrs/requests'); ?> " title = " OQRS Requests " >< i class = " fa fa-id-card " ></ i > < ? = __ ( " OQRS Requests " ); ?>
2024-07-11 18:30:46 +00:00
< ? php if ( $oqrs_requests > 0 ) {
2024-09-04 18:03:32 +02:00
echo " <span id= \" oqrs_requests \" class= \" badge text-bg-light \" > " . $oqrs_requests . " </span> " ;
2024-07-11 18:30:46 +00:00
} ?> </a></li>
< ? php } ?>
2024-07-11 12:19:46 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('qslprint'); ?> " title = " <?= __( " QSL Queue " ); ?> " >< i class = " fas fa-print " ></ i > < ? = __ ( " QSL Queue " ); ?> </a></li>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('labels'); ?> " title = " Label setup " >< i class = " fas fa-print " ></ i > < ? = __ ( " Labels " ); ?> </a></li>
2026-06-14 13:56:09 +02:00
< li >
< a class = " dropdown-item " href = " <?php echo site_url('qslpostcard'); ?> " >
< i class = " fas fa-id-card " ></ i > < ? = __ ( " QSL Postcard Designer " ); ?>
</ a >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-02-13 20:40:10 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Third-Party Services " ); ?> </a>
2024-02-08 10:51:43 +01:00
< ul class = " submenu submenu-left dropdown-menu " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('lotw'); ?> " title = " Synchronise with Logbook of the World (LoTW) " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Logbook of the World " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('eqsl/import'); ?> " title = " eQSL import / export " >< i class = " fas fa-sync " ></ i > < ? = __ ( " eQSL Import / Export " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('hrdlog/export'); ?> " title = " Upload to HRDLog.net logbook " >< i class = " fas fa-sync " ></ i > < ? = __ ( " HRDLog Logbook " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('qrz/export'); ?> " title = " Upload to QRZ.com logbook " >< i class = " fas fa-sync " ></ i > < ? = __ ( " QRZ Logbook " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('webadif/export'); ?> " title = " Upload to webADIF " >< i class = " fas fa-sync " ></ i > < ? = __ ( " QO-100 Dx Club Upload " ); ?> </a></li>
2025-01-17 14:02:20 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('clublog/export'); ?> " title = " Upload to Clublog " >< i class = " fas fa-sync " ></ i > < ? = __ ( " Clublog Import / Export " ); ?> </a></li>
2025-08-23 14:57:17 +00:00
< ? php
if ( $this -> config -> item ( 'enable_dcl_interface' ) ? ? false ) { ?>
2025-08-21 14:22:51 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('dcl'); ?> " title = " Upload to DCL " >< i class = " fas fa-sync " ></ i > < ? = __ ( " DCL Export " ); ?> </a></li>
2025-08-23 14:57:17 +00:00
< ? php } ?>
2024-02-08 10:51:43 +01:00
</ ul >
</ li >
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-02 10:22:23 +01:00
< ? php } ?> <!-- End of Clubaccess check -->
< li >< a class = " dropdown-item " href = " <?php echo site_url('api'); ?> " title = " Manage API keys " >< i class = " fas fa-key " ></ i > < ? = __ ( " API Keys " ); ?> </a></li>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('radio'); ?> " title = " Interface with one or more radios " >< i class = " fas fa-broadcast-tower " ></ i > < ? = __ ( " Hardware Interfaces " ); ?> </a></li>
2026-01-02 13:27:11 +01:00
2026-01-02 17:32:32 +01:00
< ? php if (( $this -> config -> item ( 'internal_tools' ) ? ? false ) && ( $this -> session -> userdata ( 'user_type' ) == 99 )) { ?>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2026-01-02 15:32:29 +01:00
< li >< a class = " dropdown-item dropdown-toggle dropdown-toggle-submenu " data - bs - toggle = " dropdown " >< i class = " fas fa-wrench " ></ i > < ? = __ ( " Internal tools " ); ?> </a>
2026-01-02 13:27:11 +01:00
< ul class = " submenu submenu-left dropdown-menu " >
2026-01-02 15:32:29 +01:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('calltester'); ?> " title = " Callsign DXCC checker " >< i class = " fas fa-wrench " ></ i > < ? = __ ( " Callsign DXCC checker " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('map/qso_map'); ?> " title = " GeoJSON QSO Map " >< i class = " fas fa-wrench " ></ i > < ? = __ ( " GeoJSON QSO Map " ); ?> </a></li>
< li >< a class = " dropdown-item " href = " <?php echo site_url('zonechecker'); ?> " title = " Gridsquare Zone checker " >< i class = " fas fa-wrench " ></ i > < ? = __ ( " Gridsquare Zone checker " ); ?> </a></li>
2026-01-02 13:27:11 +01:00
</ ul >
</ li >
< ? php } ?>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " javascript:displayVersionDialog(); " title = " Version Information " >< i class = " fas fa-star " ></ i > < ? = __ ( " Version Info " ); ?> </a></li>
2026-02-25 12:01:29 +01:00
< li >< a class = " dropdown-item " target = " _blank " href = " https://docs.wavelog.org/ " title = " Help " >< i class = " fas fa-question " ></ i > < ? = __ ( " Help " ); ?> </a></li>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " target = " _blank " href = " https://github.com/wavelog/wavelog/discussions " title = " Forum " >< i class = " far fa-comment-dots " ></ i > < ? = __ ( " Forum " ); ?> </a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-01-02 10:22:23 +01:00
< ? php if ( $this -> session -> userdata ( 'impersonate' ) == 1 ) { ?>
< li >
< button class = " dropdown-item " style = " flex: 1; " title = " <?= sprintf(__( " Stop impersonate and switch back to % s " ), $this->session ->userdata('cd_src_call') ?? ''); ?> " onclick = " stopImpersonate_modal() " >
< i class = " fas fa-exchange-alt " ></ i > < ? = sprintf ( __ ( " Switch back to %s " ), $this -> session -> userdata ( 'cd_src_call' ) ? ? '' ); ?>
</ button >
</ li >
< ? php } ?>
2026-06-18 23:15:44 +02:00
< ? php if ( $this -> config -> item ( 'special_callsign' ) && $this -> session -> userdata ( 'clubstation' ) == 1 && empty ( $this -> session -> userdata ( 'source_uid' ))) { ?>
< li >< a class = " dropdown-item " href = " javascript:displayOperatorDialog(); " title = " <?= __( " Switch Operator " ); ?> " >< i class = " fas fa-user-friends " ></ i > < ? = __ ( " Switch Operator " ); ?> </a></li>
< ? php } ?>
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('user/logout'); ?> " title = " Logout " >< i class = " fas fa-sign-out-alt " ></ i > < ? = __ ( " Logout " ); ?> </a></li>
2024-02-08 10:51:43 +01:00
</ ul >
2023-09-12 14:30:28 +01:00
</ li >
2024-02-17 08:52:01 +01:00
< ? php
2025-01-02 10:22:23 +01:00
if (( $quickswitch_enabled ? ? '' ) == 'true' ) { ?>
2024-03-03 21:52:51 +01:00
< li class = " nav-item dropdown " >
2026-07-04 12:55:45 +00:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " aria - label = " <?= __( " Station locations and logbooks " ); ?> " aria - haspopup = " true " >< i class = " fas fa-map-marker-alt " aria - hidden = " true " ></ i > | < i class = " fas fa-book " aria - hidden = " true " ></ i ></ a >
2024-03-03 21:52:51 +01:00
< ul class = " dropdown-menu dropdown-menu-right header-dropdown " >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item disabled " >< ? = __ ( " Select a Location " ); ?> :</a></li>
2024-03-03 21:52:51 +01:00
< ? php
// let's get all stations for the logged in user
2026-06-20 10:29:55 -07:00
if ( ! empty ( $this -> session -> userdata ( 'user_stations_active_log_only' ))) {
$all_user_locations = $this -> logbooks_model -> list_logbooks_linked ( $this -> session -> userdata ( 'active_station_logbook' ));
} else {
$all_user_locations = $this -> stations -> all_of_user ( $this -> session -> userdata ( 'user_id' ));
}
2024-03-07 20:33:17 +01:00
2024-03-03 21:52:51 +01:00
// and the set favourites as array
$location_favorites_result = $this -> user_options_model -> get_options ( 'station_location' , array ( 'option_name' => 'is_favorite' , 'option_value' => 'true' ));
$location_favorites = $location_favorites_result -> result_array ();
// also we need the current active station
$current_active_location = $this -> stations -> find_active ();
// iterate through all available stations
2026-06-20 12:33:12 -07:00
if ( $all_user_locations !== FALSE ) {
foreach ( $all_user_locations -> result () as $row ) {
// get information about this station like the name and the station id
$profile_info = $this -> stations -> profile ( $row -> station_id ) -> row ();
$station_profile_name = ( $profile_info ) ? $profile_info -> station_profile_name : 'Unknown Location' ;
$station_id = $row -> station_id ;
// the active badge, not shown by default
$active_badge = '<span id="quickswitcher_active_badge_' . $station_id . '" class="badge bg-success ms-2 d-none">' . __ ( " Active " ) . '</span>' ;
// only continue if the station id is a favourite and show the station in the list
$is_favorite = false ;
foreach ( $location_favorites as $favorite ) {
if ( $favorite [ 'option_value' ] == true && $favorite [ 'option_key' ] == $station_id ) {
$is_favorite = true ;
break ;
}
2024-03-03 21:52:51 +01:00
}
2026-06-20 12:33:12 -07:00
if ( $is_favorite ) { ?>
< li id = " quickswitcher_list_item_<?php echo $station_id ; ?> " >
< a id = " quickswitcher_list_button_<?php echo $station_id ; ?> " type = " button " onclick = " set_active_loc_quickswitcher('<?php echo $station_id ; ?>') " class = " dropdown-item quickswitcher " >
< i class = " fas fa-map-marker-alt me-2 " ></ i >< ? php echo $station_profile_name ; echo $active_badge ; ?>
</ a >
</ li >
< ? php }
}
2024-03-03 21:52:51 +01:00
} ?>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2024-06-06 20:23:19 +02:00
< li >< a class = " dropdown-item quickswitcher disabled " >< ? = __ ( " Active Logbook " ); ?> :<span class="badge text-bg-info ms-1"><?php echo $this->logbooks_model->find_name($this->session->userdata('active_station_logbook')); ?></span></a></li>
2026-07-04 13:16:25 +00:00
< li >< hr class = " dropdown-divider " ></ li >
2025-03-28 08:39:30 +00:00
< li >< a class = " dropdown-item " href = " <?php echo site_url('stationsetup'); ?> " title = " <?= __( " You miss station - locations here ? Go to stationsetup and fav them " );?> " >< ? = __ ( " Station Setup " ); ?> ...<i class="fa fa-question-circle" title="<?= __("You miss station-locations here? Go to stationsetup and fav them"); ?>"></i></a></li>
2024-03-03 21:52:51 +01:00
</ ul >
</ li >
2024-05-05 14:56:11 +02:00
< ? php } ?>
2024-05-05 17:22:22 +02:00
< ? php
$utc_headermenu = ( $this -> user_options_model -> get_options ( 'header_menu' , array ( 'option_name' => 'utc_headermenu' )) -> row () -> option_value ? ? 'false' );
2024-05-24 10:40:48 +02:00
if ( $utc_headermenu == 'true' ) {
2024-05-05 17:22:22 +02:00
?>
2024-05-08 10:11:23 +02:00
< li class = " nav-link disabled " id = " utc_header_li " >
2024-05-05 17:22:22 +02:00
< a id = " utc_header " style = " width: 70px; display: inline-block; " ></ a >
</ li >
2024-05-24 10:40:48 +02:00
< ? php }
2024-03-03 21:52:51 +01:00
2023-09-12 14:30:28 +01:00
// Can add extra menu items by defining them in options. The format is json.
2024-01-17 14:20:10 +00:00
// Useful to add extra things in Wavelog without the need for modifying files. If you add extras, these files will not be overwritten when updating.
2023-09-12 14:30:28 +01:00
//
// The menu items will be displayed to the top right under extras.
//
// Example:
// INSERT INTO options (option_name,option_value,autoload) VALUES
// ('menuitems','[
// {
// "url":"gridmap",
// "text":"Gridmap",
// "icon":"fa-globe-europe"
// },
// {
// "url":"gallery",
// "text":"Gallery",
// "icon":"fa-globe-europe"
// }
// ]','yes');
2024-05-24 10:40:48 +02:00
$menuitems = $this -> optionslib -> get_option ( 'menuitems' );
2021-02-12 23:27:08 +01:00
2024-05-24 10:40:48 +02:00
if ( $menuitems ) { ?>
2023-09-12 14:30:28 +01:00
< li class = " nav-item dropdown " >
2024-06-06 20:23:19 +02:00
< a class = " nav-link dropdown-toggle " data - bs - toggle = " dropdown " href = " # " >< ? = __ ( " Extras " ); ?> </a>
2024-02-08 10:51:43 +01:00
< div class = " dropdown-menu header-dropdown " >
2023-09-12 14:30:28 +01:00
< ? php
2024-05-24 10:40:48 +02:00
foreach ( json_decode ( $menuitems ) as $item ) {
2023-09-12 14:30:28 +01:00
echo '<a class="dropdown-item" href="' . site_url ( $item -> url ) . '" title="' . $item -> text . '"><i class="fas ' . $item -> icon . '"></i> ' . $item -> text . '</a>' ;
}
?>
</ div >
</ li >
< ? php } ?>
2024-02-08 10:51:43 +01:00
< ? php } ?>
2021-02-12 23:27:08 +01:00
2024-02-08 10:51:43 +01:00
</ ul >
2019-09-11 17:32:40 +01:00
</ div >
2023-09-12 14:30:28 +01:00
</ div >
2023-11-23 12:14:37 +01:00
</ nav >
2025-01-02 10:22:23 +01:00
< div id = " clubswitchModal-container " ></ div >
< div id = " stopImpersonateModal-container " ></ div >
2024-02-08 10:51:43 +01:00
< script >
let headerMenu = document . getElementById ( 'header-menu' );
2025-02-13 20:40:10 +01:00
let dropdowns = document . querySelectorAll ( '.dropdown-toggle-submenu' );
2024-02-08 10:51:43 +01:00
dropdowns . forEach (( dd ) => {
dd . addEventListener ( 'click' , function ( e ) {
2025-02-13 20:40:10 +01:00
e . stopPropagation ();
2024-02-08 10:51:43 +01:00
if ( headerMenu . clientWidth < 992 ) {
var el = this . nextElementSibling ;
2025-02-13 20:40:10 +01:00
dropdowns . forEach (( otherDd ) => {
if ( otherDd !== dd ) {
otherDd . nextElementSibling . style . display = 'none' ;
}
});
2024-02-08 10:51:43 +01:00
el . style . display = el . style . display === 'block' ? 'none' : 'block' ;
}
2025-02-13 20:40:10 +01:00
this . addEventListener ( 'hide.bs.dropdown' , function () {
this . nextElementSibling . style . display = 'none' ;
});
2024-02-08 10:51:43 +01:00
});
});
2024-03-07 20:33:17 +01:00
</ script >