143 lines
5.0 KiB
JavaScript
143 lines
5.0 KiB
JavaScript
// spot-worker.js - Web Worker pour traiter les spots
|
|
|
|
self.onmessage = function(e) {
|
|
|
|
const { type, data, messageId } = e.data;
|
|
|
|
switch(type) {
|
|
case 'FILTER_SPOTS':
|
|
const filtered = filterSpots(data.spots, data.filters, data.watchlist);
|
|
// ✅ AJOUTER messageId à la réponse
|
|
self.postMessage({ type: 'FILTERED_SPOTS', data: filtered, messageId });
|
|
break;
|
|
|
|
case 'SORT_SPOTS':
|
|
const sorted = sortSpots(data.spots, data.sortBy, data.sortOrder);
|
|
// ✅ AJOUTER messageId à la réponse
|
|
self.postMessage({ type: 'SORTED_SPOTS', data: sorted, messageId });
|
|
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'); |