up
This commit is contained in:
140
frontend/public/spot-worker.js
Normal file
140
frontend/public/spot-worker.js
Normal file
@@ -0,0 +1,140 @@
|
||||
// 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');
|
||||
Reference in New Issue
Block a user