Changed purple marker behavior

This commit is contained in:
Szymon Porwolik
2025-11-10 20:56:00 +01:00
parent 6166d2407c
commit 72107df163
2 changed files with 157 additions and 93 deletions

View File

@@ -27,6 +27,9 @@
var lang_bandmap_callsign_sent = "<?= __("Callsign"); ?>";
var lang_bandmap_sent_to_form = "<?= __("sent to logging form"); ?>";
var lang_bandmap_cat_control = "<?= __("CAT Connection"); ?>";
var lang_bandmap_cat_off = "<?= __("Click to enable CAT connection"); ?>";
var lang_bandmap_cat_on = "<?= __("CAT following radio | Click for frequency marker | Double-click to disable"); ?>";
var lang_bandmap_cat_marker = "<?= __("Frequency marker active | Click to disable marker | Double-click to disable CAT"); ?>";
var lang_bandmap_freq_changed = "<?= __("Frequency filter changed to"); ?>";
var lang_bandmap_by_transceiver = "<?= __("by transceiver"); ?>";
var lang_bandmap_freq_filter_set = "<?= __("Frequency filter set to"); ?>";
@@ -171,8 +174,8 @@
<!-- Row 1: CAT Connection, Radio Selector, Radio Status (left) | de Continents (right) -->
<div class="d-flex flex-wrap align-items-center gap-2 mb-2">
<!-- Left: CAT Connection Button -->
<button class="btn btn-sm btn-secondary flex-shrink-0" type="button" id="toggleCatTracking" title="<?= __("When selected the filters will be set basing on your current radio status"); ?>">
<i class="fas fa-radio"></i> <span class="d-none d-sm-inline"><?= __("CAT Connection"); ?></span>
<button class="btn btn-sm btn-secondary flex-shrink-0" type="button" id="toggleCatTracking" data-bs-toggle="tooltip" data-bs-placement="bottom">
<i class="fas fa-radio"></i> <span class="d-none d-sm-inline"><?= __("CAT Connection"); ?></span> <i class="fas fa-info-circle text-muted" style="font-size: 0.75rem;"></i>
</button>
<!-- Radio Selector Dropdown -->

View File

@@ -2276,6 +2276,14 @@ $(function() {
window.isCatTrackingEnabled = isCatTrackingEnabled; // Expose to window for cat.js
var currentRadioFrequency = null; // Store current radio frequency in kHz
var lastGradientFrequency = null; // Track last frequency used for gradient update
// Three-state CAT control: 'off', 'on', 'on+marker'
var catState = 'off';
var isFrequencyMarkerEnabled = false;
// Click detection for single/double-click
var catClickTimer = null;
var catClickPreventSingle = false;
/**
* Calculate frequency gradient color based on distance from radio frequency
@@ -2284,7 +2292,7 @@ $(function() {
* @returns {string|null} - CSS background color or null if outside gradient range
*/
function getFrequencyGradientColor(spotFreqKhz, radioFreqKhz) {
if (!radioFreqKhz || !isCatTrackingEnabled) {
if (!radioFreqKhz || !isCatTrackingEnabled || !isFrequencyMarkerEnabled) {
return null;
}
@@ -3145,100 +3153,153 @@ $(function() {
});
}
// Toggle CAT Control
$('#toggleCatTracking').on('click', function() {
let btn = $(this);
if (btn.hasClass('btn-success')) {
// Disable CAT Control
btn.removeClass('btn-success').addClass('btn-secondary');
isCatTrackingEnabled = false;
window.isCatTrackingEnabled = false; // Update window variable for cat.js
// Check if we need to show offline status (radio selected but CAT disabled)
const selectedRadio = $('.radios option:selected').val();
if (selectedRadio && selectedRadio !== '0' && typeof window.displayOfflineStatus === 'function') {
// Radio is selected but CAT Control disabled - show offline status
window.displayOfflineStatus('cat_disabled');
} else if (selectedRadio === '0' && typeof window.displayOfflineStatus === 'function') {
// No radio selected - show offline status
window.displayOfflineStatus('no_radio');
} else {
// Fallback: just hide radio status
$('#radio_cat_state').remove();
}
// Re-enable band filter controls
enableBandFilterControls();
// Unlock table sorting
unlockTableSorting();
// Reset band filter to 'All' and fetch all bands
const currentBands = $("#band").val() || [];
if (currentBands.length !== 1 || currentBands[0] !== 'All') {
$("#band").val(['All']);
updateSelectCheckboxes('band');
syncQuickFilterButtons();
applyFilters(true); // Force reload to fetch all bands
}
} else {
// Enable CAT Control
btn.removeClass('btn-secondary').addClass('btn-success');
isCatTrackingEnabled = true;
window.isCatTrackingEnabled = true; // Update window variable for cat.js
// Trigger radio status display if we have data
if (window.lastCATData) {
if (typeof window.displayRadioStatus === 'function') {
window.displayRadioStatus('success', window.lastCATData);
}
}
// Disable band filter controls
disableBandFilterControls();
// Lock table sorting to frequency only
lockTableSortingToFrequency();
// Immediately apply current radio frequency if available
if (window.lastCATData && window.lastCATData.frequency) {
const band = frequencyToBand(window.lastCATData.frequency);
if (band && band !== '') {
// Valid band found - set filter to this specific band
$("#band").val([band]);
updateSelectCheckboxes('band');
syncQuickFilterButtons();
applyFilters(false);
if (typeof showToast === 'function') {
showToast(lang_bandmap_cat_control, `${lang_bandmap_freq_filter_set} ${band} ${lang_bandmap_by_transceiver}`, 'bg-info text-white', 3000);
}
} else {
// No band match - clear band filter to show all bands
$("#band").val(['All']);
updateSelectCheckboxes('band');
syncQuickFilterButtons();
applyFilters(false);
if (typeof showToast === 'function') {
showToast(lang_bandmap_cat_control, lang_bandmap_freq_outside, 'bg-warning text-dark', 3000);
}
}
} else {
if (typeof showToast === 'function') {
showToast(lang_bandmap_cat_control, lang_bandmap_waiting_radio, 'bg-info text-white', 2000);
}
/**
* Update button visual appearance based on CAT state
*/
function updateButtonVisual(state) {
let btn = $('#toggleCatTracking');
let radioIcon = btn.find('i.fa-radio');
btn.removeClass('btn-secondary btn-success');
radioIcon.removeClass('fa-podcast fa-crosshairs').css('color', '');
btn.css('box-shadow', '');
if (state === 'off') {
btn.addClass('btn-secondary').attr('data-bs-original-title', lang_bandmap_cat_off);
radioIcon.addClass('fa-radio');
} else if (state === 'on') {
btn.addClass('btn-success').attr('data-bs-original-title', lang_bandmap_cat_on);
radioIcon.addClass('fa-radio');
} else if (state === 'on+marker') {
btn.addClass('btn-success').attr('data-bs-original-title', lang_bandmap_cat_marker);
radioIcon.addClass('fa-radio').css('color', '#8a2be2');
btn.css('box-shadow', '0 0 8px rgba(138, 43, 226, 0.6)');
}
// Update tooltip if it exists
if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {
let tooltip = bootstrap.Tooltip.getInstance(btn[0]);
if (tooltip) {
tooltip.hide();
}
}
}
// Toggle CAT Control with state machine
$('#toggleCatTracking').on('click', function() {
catClickTimer = setTimeout(function() {
if (!catClickPreventSingle) {
handleCatSingleClick();
}
catClickPreventSingle = false;
}, 300);
});
$('#toggleCatTracking').on('dblclick', function() {
clearTimeout(catClickTimer);
catClickPreventSingle = true;
handleCatDoubleClick();
});
// Initialize tooltip on page load - set initial title only
$('#toggleCatTracking').attr('data-bs-original-title', lang_bandmap_cat_off);
function handleCatSingleClick() {
const selectedRadio = $('.radios option:selected').val();
switch(catState) {
case 'off':
// OFF → ON
if (!selectedRadio || selectedRadio === '0') {
if (typeof showToast === 'function') {
showToast(lang_bandmap_cat_control, lang_bandmap_select_radio_first, 'bg-warning text-dark', 3000);
}
return;
}
isCatTrackingEnabled = true;
window.isCatTrackingEnabled = true;
catState = 'on';
if (window.lastCATData && typeof window.displayRadioStatus === 'function') {
window.displayRadioStatus('success', window.lastCATData);
}
disableBandFilterControls();
if (window.lastCATData && window.lastCATData.frequency) {
const band = frequencyToBand(window.lastCATData.frequency);
if (band && band !== '') {
$("#band").val([band]);
updateSelectCheckboxes('band');
syncQuickFilterButtons();
applyFilters(false);
}
}
updateButtonVisual('on');
break;
case 'on':
// ON → ON+MARKER
isFrequencyMarkerEnabled = true;
catState = 'on+marker';
lockTableSortingToFrequency();
if (window.lastCATData && window.lastCATData.frequency) {
updateFrequencyGradientColors(window.lastCATData.frequency);
}
updateButtonVisual('on+marker');
break;
case 'on+marker':
// ON+MARKER → ON
isFrequencyMarkerEnabled = false;
catState = 'on';
unlockTableSorting();
clearFrequencyGradientColors();
updateButtonVisual('on');
break;
}
}
function handleCatDoubleClick() {
// Double-click: Force disable from any state
if (catState === 'off') return;
isCatTrackingEnabled = false;
window.isCatTrackingEnabled = false;
isFrequencyMarkerEnabled = false;
catState = 'off';
const selectedRadio = $('.radios option:selected').val();
if (selectedRadio && selectedRadio !== '0' && typeof window.displayOfflineStatus === 'function') {
window.displayOfflineStatus('cat_disabled');
} else if (selectedRadio === '0' && typeof window.displayOfflineStatus === 'function') {
window.displayOfflineStatus('no_radio');
} else {
$('#radio_cat_state').remove();
}
enableBandFilterControls();
unlockTableSorting();
clearFrequencyGradientColors();
const currentBands = $("#band").val() || [];
if (currentBands.length !== 1 || currentBands[0] !== 'All') {
$("#band").val(['All']);
updateSelectCheckboxes('band');
syncQuickFilterButtons();
applyFilters(true);
}
updateButtonVisual('off');
}
// ========================================
// RESPONSIVE COLUMN VISIBILITY
// ========================================