147 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// spot-worker.js - Web Worker pour traiter les spots
 | 
						|
 | 
						|
let lastProcessedData = null;
 | 
						|
 | 
						|
self.onmessage = function(e) {
 | 
						|
  const { type, data, messageId } = e.data;
 | 
						|
  
 | 
						|
  // Libérer l'ancienne référence
 | 
						|
  lastProcessedData = null;
 | 
						|
  
 | 
						|
  switch(type) {
 | 
						|
    case 'FILTER_SPOTS':
 | 
						|
      const filtered = filterSpots(data.spots, data.filters, data.watchlist);
 | 
						|
      self.postMessage({ type: 'FILTERED_SPOTS', data: filtered, messageId });
 | 
						|
      lastProcessedData = null;
 | 
						|
      break;
 | 
						|
      
 | 
						|
    case 'SORT_SPOTS':
 | 
						|
      const sorted = sortSpots(data.spots, data.sortBy, data.sortOrder);
 | 
						|
      self.postMessage({ type: 'SORTED_SPOTS', data: sorted, messageId });
 | 
						|
      lastProcessedData = null;
 | 
						|
      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'); |