From 43e7d9cb9dcdb5c7457044165d94d64a523c9288 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 17:44:25 +0100 Subject: [PATCH 01/10] Fix undefined index errors in statistics tables Initialize bandcalls and modecalls arrays with default zero values in Stats.php to prevent undefined index errors. Update qsotable.php and uniquetable.php views to display 0 when mode or band totals are not set. --- application/models/Stats.php | 10 ++++++++++ application/views/statistics/qsotable.php | 2 +- application/views/statistics/uniquetable.php | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/application/models/Stats.php b/application/models/Stats.php index 8fb9bf20..2cdbf1c7 100644 --- a/application/models/Stats.php +++ b/application/models/Stats.php @@ -88,10 +88,20 @@ } } + // Initialize bandcalls array with all bands set to 0 + foreach ($bands as $band) { + $bandcalls[$band] = 0; + } + foreach ($bandunique as $band) { $bandcalls[$band->band] = $band->calls; } + // Initialize modecalls array with all modes set to 0 + foreach ($modes as $mode) { + $modecalls[$mode] = 0; + } + foreach ($modeunique as $mode) { //if ($mode->col_submode == null) { if ($mode->col_submode == null || $mode->col_submode == "") { diff --git a/application/views/statistics/qsotable.php b/application/views/statistics/qsotable.php index 7f963fb3..0b80943f 100644 --- a/application/views/statistics/qsotable.php +++ b/application/views/statistics/qsotable.php @@ -17,7 +17,7 @@ if ($qsoarray) { foreach ($value as $key => $val) { echo '' . $val . ''; } - echo '' . $modetotal[$mode] . ''; + echo '' . (isset($modetotal[$mode]) ? $modetotal[$mode] : 0) . ''; echo ''; } echo ''.lang('statistics_total').''; diff --git a/application/views/statistics/uniquetable.php b/application/views/statistics/uniquetable.php index 0a25b170..7685bf2c 100644 --- a/application/views/statistics/uniquetable.php +++ b/application/views/statistics/uniquetable.php @@ -17,13 +17,13 @@ if ($qsoarray) { foreach ($value as $key => $val) { echo '' . $val . ''; } - echo '' . $modeunique[$mode] . ''; + echo '' . (isset($modeunique[$mode]) ? $modeunique[$mode] : 0) . ''; echo ''; } echo ''.lang('statistics_total').''; foreach($bands as $band) { - echo '' . $bandunique[$band] . ''; + echo '' . (isset($bandunique[$band]) ? $bandunique[$band] : 0) . ''; } echo '' . $total->calls . ''; echo ''; From 129cb5986fbdbe5769ee224703c00f4292277aa2 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 18:29:47 +0100 Subject: [PATCH 02/10] Enhance custom map UI and add loading feedback Improves the custom map interface with a redesigned filter section, quick action buttons, advanced filters, and a statistics display. Adds a loading spinner, disables the submit button during map load, and provides success/error feedback with failsafe timeout. Integrates new CSS for better map and legend styling, and updates JS to support callbacks for AJAX success/error, improving user experience and reliability. --- application/views/interface_assets/footer.php | 67 +++ application/views/map/custom_date.php | 547 +++++++++++++++--- assets/css/map-enhancements.css | 74 +++ assets/js/leaflet/leafembed.js | 19 +- 4 files changed, 615 insertions(+), 92 deletions(-) create mode 100644 assets/css/map-enhancements.css diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 87044478..2b4197e2 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -784,6 +784,26 @@ if ($this->session->userdata('user_id') != null) { }); // Form "submit" // $('.custom-map-QSOs .btn_submit_map_custom').off('click').on('click', function() { + // Show loading spinner and disable button + const $button = $(this); + const $spinner = $('#load-spinner'); + + $button.prop('disabled', true); + $spinner.removeClass('d-none'); + + // Hide any previous alerts + $('.warningOnSubmit').hide(); + $('#map-success-alert').addClass('d-none'); + + // Failsafe timeout to prevent stuck spinner (35 seconds) + const failsafeTimeout = setTimeout(function() { + console.warn('Map loading timed out - forcing spinner hide'); + $button.prop('disabled', false); + $spinner.addClass('d-none'); + $('.warningOnSubmit .warningOnSubmit_txt').text('Map loading timed out. Please try again.'); + $('.warningOnSubmit').show(); + }, 35000); + var customdata = { 'dataPost': { 'date_from': $('.custom-map-QSOs input[name="from"]').val(), @@ -795,6 +815,49 @@ if ($this->session->userdata('user_id') != null) { }, 'map_id': '#custommap' }; + + // Add success and error callbacks to the customdata + customdata.onSuccess = function(plotjson) { + // Clear the failsafe timeout + clearTimeout(failsafeTimeout); + + try { + // Update statistics + if (typeof updateMapStatistics === 'function') { + updateMapStatistics(plotjson); + } + + // Show success message + const qsoCount = plotjson['markers'] ? plotjson['markers'].length : 0; + $('#qso-count-display').text(`Loaded ${qsoCount} QSOs successfully`); + $('#map-success-alert').removeClass('d-none'); + + setTimeout(() => { + $('#map-success-alert').addClass('d-none'); + }, 3000); + } catch (error) { + console.error('Error in success callback:', error); + $('.warningOnSubmit .warningOnSubmit_txt').text('Map loaded but encountered an error displaying statistics.'); + $('.warningOnSubmit').show(); + } finally { + // Always re-enable button and hide spinner + $button.prop('disabled', false); + $spinner.addClass('d-none'); + } + }; + + customdata.onError = function() { + // Clear the failsafe timeout + clearTimeout(failsafeTimeout); + + $('.warningOnSubmit .warningOnSubmit_txt').text('Failed to load map data. Please try again.'); + $('.warningOnSubmit').show(); + + // Re-enable button and hide spinner + $button.prop('disabled', false); + $spinner.addClass('d-none'); + }; + initplot(qso_loc, customdata); }) }); @@ -806,6 +869,10 @@ if ($this->session->userdata('user_id') != null) { success: function(data) { document.getElementById('from').value = data; document.getElementById('to').value = new Date().toISOString().split('T')[0]; + // Update the date range display + if (typeof updateDateRangeDisplay === 'function') { + updateDateRangeDisplay(); + } }, error: function() {}, }); diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index 58c982c7..b0498b24 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -1,107 +1,474 @@ + +

-

QSOs (Custom Dates)

+ + +
+
+
+
+
+
+

+ + QSOs (Custom Dates) +

+
+
+
+
+
+
session->flashdata('notice')) { ?> -
-
-
- - -
- -
- - -
- -
- -
+ +
+
+
+ Filter Controls +
+
+ + + +
+
+
+
+
+ Quick Filters +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
-
-
- - -
+ +
+
+
+
+
+ Date Range +
+
+
+ + +
+
+ + +
+
+
+
+
+
-
- - -
- lang('gen_hamradio_propagation_AS'), - 'AUR' => lang('gen_hamradio_propagation_AUR'), - 'AUE' => lang('gen_hamradio_propagation_AUE'), - 'BS' => lang('gen_hamradio_propagation_BS'), - 'ECH' => lang('gen_hamradio_propagation_ECH'), - 'EME' => lang('gen_hamradio_propagation_EME'), - 'ES' => lang('gen_hamradio_propagation_ES'), - 'FAI' => lang('gen_hamradio_propagation_FAI'), - 'F2' => lang('gen_hamradio_propagation_F2'), - 'INTERNET' => lang('gen_hamradio_propagation_INTERNET'), - 'ION' => lang('gen_hamradio_propagation_ION'), - 'IRL' => lang('gen_hamradio_propagation_IRL'), - 'MS' => lang('gen_hamradio_propagation_MS'), - 'RPT' => lang('gen_hamradio_propagation_RPT'), - 'RS' => lang('gen_hamradio_propagation_RS'), - 'SAT' => lang('gen_hamradio_propagation_SAT'), - 'TEP' => lang('gen_hamradio_propagation_TEP'), - 'TR' => lang('gen_hamradio_propagation_TR')]; - asort($prop_modes); - ?> -
- - -
+ +
+
+
+
+
+ Advanced Filters +
+
+
+ + +
+ +
+ + +
+ + lang('gen_hamradio_propagation_AS'), + 'AUR' => lang('gen_hamradio_propagation_AUR'), + 'AUE' => lang('gen_hamradio_propagation_AUE'), + 'BS' => lang('gen_hamradio_propagation_BS'), + 'ECH' => lang('gen_hamradio_propagation_ECH'), + 'EME' => lang('gen_hamradio_propagation_EME'), + 'ES' => lang('gen_hamradio_propagation_ES'), + 'FAI' => lang('gen_hamradio_propagation_FAI'), + 'F2' => lang('gen_hamradio_propagation_F2'), + 'INTERNET' => lang('gen_hamradio_propagation_INTERNET'), + 'ION' => lang('gen_hamradio_propagation_ION'), + 'IRL' => lang('gen_hamradio_propagation_IRL'), + 'MS' => lang('gen_hamradio_propagation_MS'), + 'RPT' => lang('gen_hamradio_propagation_RPT'), + 'RS' => lang('gen_hamradio_propagation_RS'), + 'SAT' => lang('gen_hamradio_propagation_SAT'), + 'TEP' => lang('gen_hamradio_propagation_TEP'), + 'TR' => lang('gen_hamradio_propagation_TR')]; + asort($prop_modes); + ?> +
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+ +
+ + Map loaded successfully +
+
+
+
- -
-
- -
-
- -
-
- +
- -
+ +
+
+
+
+
+
+
+
+ QSOs Displayed: + 0 +
- \ No newline at end of file +
+ Map loaded successfully +
+
+
+
+
+ + + +
+
+
+
+
+
+
+ + +
+
+
+ World Map View +
+
+ Showing: +
+
+
+
+
+
+ + +
+
+
+
+
+
+ Legend: + + + QSO + + + + Home Station + +
+
+ + + Click on markers for QSO details + +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/assets/css/map-enhancements.css b/assets/css/map-enhancements.css new file mode 100644 index 00000000..f8a8c67d --- /dev/null +++ b/assets/css/map-enhancements.css @@ -0,0 +1,74 @@ +/* Custom Map Interface Enhancements */ + +/* Ensure grid square labels stay together (fix for separated letters) */ +.leaflet-marker-icon.my-div-icon, +.my-div-icon .grid-text, +.my-div-icon .grid-text font, +span.grid-text, +span.grid-text > font { + letter-spacing: 0 !important; + word-spacing: 0 !important; + white-space: nowrap !important; + font-family: monospace !important; + display: inline-block !important; +} + +/* Map container enhancements */ +#custommap { + border-radius: 0 0 0.375rem 0.375rem; + overflow: hidden; + transition: height 0.3s ease; + width: 100%; + height: 1000px !important; /* Maintain original screenshot-friendly height */ +} + +/* Fullscreen map styling */ +#custommap:fullscreen { + border-radius: 0; +} + +/* Statistics badges */ +.custom-map-QSOs .badge { + font-size: 0.85em; + padding: 0.5em 0.75em; +} + + +/* Legend styling */ +.custom-map-QSOs .fas { + width: 1em; + text-align: center; +} + +/* Responsive improvements */ +@media (max-width: 768px) { + .custom-map-QSOs .card-body { + padding: 1rem 0.5rem; + } + + .custom-map-QSOs .btn-group .btn { + padding: 0.375rem 0.5rem; + font-size: 0.8rem; + } + + /* Keep map height at 1000px even on mobile for screenshots */ + #custommap { + height: 1000px !important; + min-height: 1000px !important; + } +} + +/* Animation for statistics updates */ +.custom-map-QSOs .badge { + transition: all 0.3s ease; +} + +.custom-map-QSOs .badge.updated { + animation: pulse 0.5s ease-in-out; +} + +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} \ No newline at end of file diff --git a/assets/js/leaflet/leafembed.js b/assets/js/leaflet/leafembed.js index b2a59bf9..8a459a9e 100644 --- a/assets/js/leaflet/leafembed.js +++ b/assets/js/leaflet/leafembed.js @@ -68,8 +68,18 @@ function askForPlots(_url_qso, options={}) { removeMarkers(); if (typeof options.dataPost !== "undefined") { _dataPost = options.dataPost; } else { _dataPost = {}; } $.ajax({ - url: _url_qso, type: 'POST', dataType: 'json', data: _dataPost, - error: function() { console.log('[ERROR] ajax askForPlots() function return error.'); }, + url: _url_qso, + type: 'POST', + dataType: 'json', + data: _dataPost, + timeout: 30000, // 30 second timeout + error: function(xhr, status, error) { + console.log('[ERROR] ajax askForPlots() function return error:', status, error); + // Call custom error callback if provided + if (typeof options.onError === 'function') { + options.onError(); + } + }, success: function(plotjson) { if ((typeof plotjson['markers'] !== "undefined")&&(plotjson['markers'].length>0)) { for (i=0;i Date: Sun, 10 Aug 2025 22:06:11 +0100 Subject: [PATCH 03/10] Add debug logging and improve map loading UX Added console logging to map loading callbacks and AJAX requests for better debugging. Reduced failsafe timeout from 35s to 10s to improve user experience. Improved date range display logic to check for element existence before updating. --- application/views/interface_assets/footer.php | 13 +++++++++++-- application/views/map/custom_date.php | 15 +++++++++------ assets/js/leaflet/leafembed.js | 8 +++++++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 2b4197e2..948d813e 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -795,14 +795,14 @@ if ($this->session->userdata('user_id') != null) { $('.warningOnSubmit').hide(); $('#map-success-alert').addClass('d-none'); - // Failsafe timeout to prevent stuck spinner (35 seconds) + // Failsafe timeout to prevent stuck spinner (10 seconds) const failsafeTimeout = setTimeout(function() { console.warn('Map loading timed out - forcing spinner hide'); $button.prop('disabled', false); $spinner.addClass('d-none'); $('.warningOnSubmit .warningOnSubmit_txt').text('Map loading timed out. Please try again.'); $('.warningOnSubmit').show(); - }, 35000); + }, 10000); var customdata = { 'dataPost': { @@ -818,17 +818,23 @@ if ($this->session->userdata('user_id') != null) { // Add success and error callbacks to the customdata customdata.onSuccess = function(plotjson) { + console.log('Map loading success callback called with data:', plotjson); + // Clear the failsafe timeout clearTimeout(failsafeTimeout); try { // Update statistics if (typeof updateMapStatistics === 'function') { + console.log('Calling updateMapStatistics function'); updateMapStatistics(plotjson); + } else { + console.warn('updateMapStatistics function not found'); } // Show success message const qsoCount = plotjson['markers'] ? plotjson['markers'].length : 0; + console.log('QSO count:', qsoCount); $('#qso-count-display').text(`Loaded ${qsoCount} QSOs successfully`); $('#map-success-alert').removeClass('d-none'); @@ -841,12 +847,15 @@ if ($this->session->userdata('user_id') != null) { $('.warningOnSubmit').show(); } finally { // Always re-enable button and hide spinner + console.log('Re-enabling button and hiding spinner'); $button.prop('disabled', false); $spinner.addClass('d-none'); } }; customdata.onError = function() { + console.log('Map loading error callback called'); + // Clear the failsafe timeout clearTimeout(failsafeTimeout); diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index b0498b24..5791d9f5 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -327,14 +327,17 @@ function updateDateRangeDisplay() { const toDate = document.getElementById('to').value; const display = document.getElementById('date-range-display'); - if (fromDate && toDate) { - if (fromDate === toDate) { - display.textContent = new Date(fromDate).toLocaleDateString(); + // Only update if the display element exists + if (display) { + if (fromDate && toDate) { + if (fromDate === toDate) { + display.textContent = new Date(fromDate).toLocaleDateString(); + } else { + display.textContent = new Date(fromDate).toLocaleDateString() + ' - ' + new Date(toDate).toLocaleDateString(); + } } else { - display.textContent = new Date(fromDate).toLocaleDateString() + ' - ' + new Date(toDate).toLocaleDateString(); + display.textContent = 'Select dates'; } - } else { - display.textContent = 'Select dates'; } } diff --git a/assets/js/leaflet/leafembed.js b/assets/js/leaflet/leafembed.js index 8a459a9e..4d54322f 100644 --- a/assets/js/leaflet/leafembed.js +++ b/assets/js/leaflet/leafembed.js @@ -65,6 +65,7 @@ function initplot(_url_qso, options={}) { } function askForPlots(_url_qso, options={}) { + console.log('askForPlots called with URL:', _url_qso, 'options:', options); removeMarkers(); if (typeof options.dataPost !== "undefined") { _dataPost = options.dataPost; } else { _dataPost = {}; } $.ajax({ @@ -74,13 +75,15 @@ function askForPlots(_url_qso, options={}) { data: _dataPost, timeout: 30000, // 30 second timeout error: function(xhr, status, error) { - console.log('[ERROR] ajax askForPlots() function return error:', status, error); + console.log('[ERROR] ajax askForPlots() function return error:', status, error, xhr); // Call custom error callback if provided if (typeof options.onError === 'function') { + console.log('Calling custom error callback'); options.onError(); } }, success: function(plotjson) { + console.log('askForPlots AJAX success, plotjson:', plotjson); if ((typeof plotjson['markers'] !== "undefined")&&(plotjson['markers'].length>0)) { for (i=0;i Date: Sun, 10 Aug 2025 22:08:31 +0100 Subject: [PATCH 04/10] Increase map and AJAX request timeouts Extended the failsafe timeout for map loading from 10 to 60 seconds in the footer and increased the AJAX request timeout in leafembed.js from 30 to 50 seconds to better accommodate slow responses. --- application/views/interface_assets/footer.php | 4 ++-- assets/js/leaflet/leafembed.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 948d813e..c23b6011 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -795,14 +795,14 @@ if ($this->session->userdata('user_id') != null) { $('.warningOnSubmit').hide(); $('#map-success-alert').addClass('d-none'); - // Failsafe timeout to prevent stuck spinner (10 seconds) + // Failsafe timeout to prevent stuck spinner (60 seconds) const failsafeTimeout = setTimeout(function() { console.warn('Map loading timed out - forcing spinner hide'); $button.prop('disabled', false); $spinner.addClass('d-none'); $('.warningOnSubmit .warningOnSubmit_txt').text('Map loading timed out. Please try again.'); $('.warningOnSubmit').show(); - }, 10000); + }, 60000); var customdata = { 'dataPost': { diff --git a/assets/js/leaflet/leafembed.js b/assets/js/leaflet/leafembed.js index 4d54322f..432c6e39 100644 --- a/assets/js/leaflet/leafembed.js +++ b/assets/js/leaflet/leafembed.js @@ -73,7 +73,7 @@ function askForPlots(_url_qso, options={}) { type: 'POST', dataType: 'json', data: _dataPost, - timeout: 30000, // 30 second timeout + timeout: 50000, // 50 second timeout error: function(xhr, status, error) { console.log('[ERROR] ajax askForPlots() function return error:', status, error, xhr); // Call custom error callback if provided From b03a16cbd0fcf51b9e4e37932d7a9e2c86f3879d Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 22:10:50 +0100 Subject: [PATCH 05/10] Remove unused date range display logic Eliminated calls and function for updating the date-range-display element, which does not exist in the DOM. This cleans up unnecessary JavaScript and prevents potential errors. --- application/views/map/custom_date.php | 28 ++------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index 5791d9f5..78b57492 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -315,32 +315,10 @@ \ No newline at end of file From 05834136e73bac5c3a99577046a969d7e0ad76e1 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 22:39:27 +0100 Subject: [PATCH 07/10] Remove unused gridsquare assignment in Logbook_model Deleted the assignment of 'gridsquare' to the $plot array in Logbook_model.php as it was not being used elsewhere in the code. --- application/models/Logbook_model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index e9b6f5f4..f44b579e 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -4857,7 +4857,6 @@ class Logbook_model extends CI_Model $plot = array('lat' => 0, 'lng' => 0, 'html' => '', 'label' => '', 'flag' => '', 'confirmed' => 'N'); $plot['label'] = $row->COL_CALL; - $plot['gridsquare'] = $row->COL_GRIDSQUARE; // Add gridsquare for potential use in labels $flag = strtolower($CI->dxccflag->getISO($row->COL_DXCC)); $plot['flag'] = 'name))) . '"> '; $plot['html'] = ($row->COL_GRIDSQUARE != null ? "Grid: " . $row->COL_GRIDSQUARE . "
" : ""); From 625f3d70fc5ca728d54b5f2c1dfc50a37a719c61 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 22:57:16 +0100 Subject: [PATCH 08/10] Refine callsign label handling on map Added 'callsign' property to plot data in Logbook_model and updated custom_date.php to use only the 'callsign' for map labels. Simplified and removed aggressive CSS targeting for tooltip classes, ensuring consistent font size and cleaner label rendering. --- application/models/Logbook_model.php | 1 + application/views/map/custom_date.php | 59 ++------------------------- 2 files changed, 5 insertions(+), 55 deletions(-) diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index f44b579e..c4d5bdb4 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -4857,6 +4857,7 @@ class Logbook_model extends CI_Model $plot = array('lat' => 0, 'lng' => 0, 'html' => '', 'label' => '', 'flag' => '', 'confirmed' => 'N'); $plot['label'] = $row->COL_CALL; + $plot['callsign'] = $row->COL_CALL; $flag = strtolower($CI->dxccflag->getISO($row->COL_DXCC)); $plot['flag'] = 'name))) . '"> '; $plot['html'] = ($row->COL_GRIDSQUARE != null ? "Grid: " . $row->COL_GRIDSQUARE . "
" : ""); diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index 636d6413..ebb77544 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -1,55 +1,6 @@
@@ -502,9 +451,9 @@ function toggleCallsignLabels() { // Show callsign labels if (typeof plotlayers !== 'undefined' && plotlayers.length > 0) { plotlayers.forEach(function(marker) { - if (marker.data && (marker.data.callsign || marker.data.label)) { - // Use callsign if available, otherwise fall back to label - const callsign = marker.data.callsign || marker.data.label; + if (marker.data && marker.data.callsign) { + // Only create labels when callsign is specifically provided + const callsign = marker.data.callsign; // Try a different approach - create a DivIcon instead of tooltip const labelIcon = L.divIcon({ From 9baee1ee84b6c74da15b2b442b3627bfe61cbd33 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Sun, 10 Aug 2025 22:58:21 +0100 Subject: [PATCH 09/10] Reduce font size in custom_date map view Changed the font size from 15px to 12px in the custom_date.php map view for improved consistency and appearance. --- application/views/map/custom_date.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index ebb77544..6db7f909 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -19,7 +19,7 @@ width: auto !important; height: auto !important; transform-origin: center !important; - font-size: 15px !important; /* Ensure consistent font size */ + font-size: 12px !important; /* Ensure consistent font size */ } From 61f55945983c420c6880298f23759acf462cb92f Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Mon, 11 Aug 2025 10:45:51 +0100 Subject: [PATCH 10/10] Refactor map header layout and controls Merged map statistics, controls, and header into a single card header for improved UI clarity and compactness. The new layout consolidates the QSOs count, map status, and control buttons, streamlining the map view presentation. --- application/views/map/custom_date.php | 77 ++++++++++++--------------- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/application/views/map/custom_date.php b/application/views/map/custom_date.php index 6db7f909..65794ec2 100644 --- a/application/views/map/custom_date.php +++ b/application/views/map/custom_date.php @@ -255,54 +255,43 @@
- -
-
-
-
-
-
-
-
- QSOs Displayed: - 0 -
- -
- Map loaded successfully -
-
+ +
+
+
+
+
+ World Map View +
+ Showing: +
+
+
+
+ QSOs Displayed: + 0
-
-
- - - - -
+
+ Map loaded successfully
-
-
-
- - -
-
-
- World Map View -
-
- Showing: +
+
+ + + + +
+