Files
FlexDXClusterGui/frontend/public/spot-worker.js
2025-10-15 22:01:03 +05:30

140 lines
4.9 KiB
JavaScript

// spot-worker.js - Web Worker pour traiter les spots
self.onmessage = function(e) {
const { type, data } = e.data;
switch(type) {
case 'FILTER_SPOTS':
const filtered = filterSpots(data.spots, data.filters, data.watchlist);
self.postMessage({ type: 'FILTERED_SPOTS', data: filtered });
break;
case 'SORT_SPOTS':
const sorted = sortSpots(data.spots, data.sortBy, data.sortOrder);
self.postMessage({ type: 'SORTED_SPOTS', data: sorted });
break;
default:
console.error('Unknown worker message type:', type);
}
};
function filterSpots(allSpots, filters, watchlist) {
if (!allSpots || !Array.isArray(allSpots)) return [];
// Si "All" est actif, retourner tous les spots
if (filters.showAll) {
return allSpots;
}
const bandFiltersActive = filters.band160M || filters.band80M || filters.band60M ||
filters.band40M || filters.band30M || filters.band20M || filters.band17M ||
filters.band15M || filters.band12M || filters.band10M || filters.band6M;
const typeFiltersActive = filters.showNewDXCC || filters.showNewBand ||
filters.showNewMode || filters.showNewBandMode || filters.showNewSlot ||
filters.showWorked || filters.showWatchlist;
const modeFiltersActive = filters.showDigital || filters.showSSB || filters.showCW;
return allSpots.filter(spot => {
let matchesBand = false;
let matchesType = false;
let matchesMode = false;
// Filtres de bande
if (bandFiltersActive) {
matchesBand = (
(filters.band160M && spot.Band === '160M') ||
(filters.band80M && spot.Band === '80M') ||
(filters.band60M && spot.Band === '60M') ||
(filters.band40M && spot.Band === '40M') ||
(filters.band30M && spot.Band === '30M') ||
(filters.band20M && spot.Band === '20M') ||
(filters.band17M && spot.Band === '17M') ||
(filters.band15M && spot.Band === '15M') ||
(filters.band12M && spot.Band === '12M') ||
(filters.band10M && spot.Band === '10M') ||
(filters.band6M && spot.Band === '6M')
);
}
// Filtres de type
if (typeFiltersActive) {
if (filters.showWatchlist) {
const inWatchlist = watchlist.some(pattern =>
spot.DX === pattern || spot.DX.startsWith(pattern)
);
if (inWatchlist) matchesType = true;
}
if (filters.showNewDXCC && spot.NewDXCC) matchesType = true;
else if (filters.showNewBandMode && spot.NewBand && spot.NewMode && !spot.NewDXCC) matchesType = true;
else if (filters.showNewBand && spot.NewBand && !spot.NewMode && !spot.NewDXCC) matchesType = true;
else if (filters.showNewMode && spot.NewMode && !spot.NewBand && !spot.NewDXCC) matchesType = true;
else if (filters.showNewSlot && spot.NewSlot && !spot.NewDXCC && !spot.NewBand && !spot.NewMode) matchesType = true;
else if (filters.showWorked && spot.Worked) matchesType = true;
}
// Filtres de mode
if (modeFiltersActive) {
const mode = spot.Mode || '';
if (filters.showDigital && ['FT8', 'FT4', 'RTTY'].includes(mode)) matchesMode = true;
if (filters.showSSB && ['SSB', 'USB', 'LSB'].includes(mode)) matchesMode = true;
if (filters.showCW && mode === 'CW') matchesMode = true;
}
// Logique de combinaison des filtres
const numActiveFilterTypes = [bandFiltersActive, typeFiltersActive, modeFiltersActive].filter(Boolean).length;
if (numActiveFilterTypes === 0) return false;
if (numActiveFilterTypes === 1) {
if (bandFiltersActive) return matchesBand;
if (typeFiltersActive) return matchesType;
if (modeFiltersActive) return matchesMode;
}
if (numActiveFilterTypes === 2) {
if (bandFiltersActive && typeFiltersActive) return matchesBand && matchesType;
if (bandFiltersActive && modeFiltersActive) return matchesBand && matchesMode;
if (typeFiltersActive && modeFiltersActive) return matchesType && matchesMode;
}
if (numActiveFilterTypes === 3) {
return matchesBand && matchesType && matchesMode;
}
return false;
});
}
function sortSpots(spots, sortBy, sortOrder) {
if (!spots || !Array.isArray(spots)) return [];
const sorted = [...spots].sort((a, b) => {
let compareValue = 0;
switch(sortBy) {
case 'dx':
compareValue = a.DX.localeCompare(b.DX);
break;
case 'frequency':
compareValue = parseFloat(a.FrequencyMhz) - parseFloat(b.FrequencyMhz);
break;
case 'band':
compareValue = a.Band.localeCompare(b.Band);
break;
case 'mode':
compareValue = a.Mode.localeCompare(b.Mode);
break;
case 'time':
compareValue = a.UTCTime.localeCompare(b.UTCTime);
break;
default:
compareValue = a.ID - b.ID; // Par défaut, tri par ID
}
return sortOrder === 'asc' ? compareValue : -compareValue;
});
return sorted;
}
console.log('Spot Worker initialized');