diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html
index 965dcc7..abe68c3 100644
--- a/templates/adsb_dashboard.html
+++ b/templates/adsb_dashboard.html
@@ -595,6 +595,15 @@
@@ -1040,9 +1139,13 @@
const heading = ac.heading ? ac.heading + '°' : 'N/A';
const squawk = ac.squawk || 'N/A';
const vRate = ac.vRate ? (ac.vRate > 0 ? '+' : '') + ac.vRate + ' ft/min' : 'N/A';
+ const militaryInfo = isMilitaryAircraft(ac.icao, ac.callsign);
+ const militaryBadge = militaryInfo.military ?
+ `
MILITARY AIRCRAFT${militaryInfo.country ? ' (' + militaryInfo.country + ')' : ''}
` : '';
container.innerHTML = `
${callsign}
+ ${militaryBadge}
ICAO
diff --git a/templates/index.html b/templates/index.html
index dd42b8a..9c84359 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -3193,6 +3193,15 @@
Cluster Markers
+
+
+
+
@@ -7688,6 +7697,27 @@
}
}
+ function applyAircraftFilter() {
+ // Clear all markers and redraw with new filter
+ Object.keys(aircraftMarkers).forEach(icao => {
+ if (clusteringEnabled && aircraftClusterGroup) {
+ aircraftClusterGroup.removeLayer(aircraftMarkers[icao]);
+ } else if (aircraftMap) {
+ aircraftMap.removeLayer(aircraftMarkers[icao]);
+ }
+ delete aircraftMarkers[icao];
+ delete aircraftMarkerState[icao];
+ });
+ // Trail lines should also be cleared for filtered-out aircraft
+ Object.keys(aircraftTrailLines).forEach(icao => {
+ if (aircraftMap) {
+ aircraftMap.removeLayer(aircraftTrailLines[icao]);
+ }
+ delete aircraftTrailLines[icao];
+ });
+ updateAircraftMarkers();
+ }
+
function updateRadarTime() {
const now = new Date();
const time = now.toTimeString().substring(0, 8);
@@ -7762,11 +7792,21 @@
const showLabels = document.getElementById('adsbShowLabels')?.checked;
const showAltitude = document.getElementById('adsbShowAltitude')?.checked;
const showTrails = document.getElementById('adsbShowTrails')?.checked ?? true;
+ const aircraftFilter = document.getElementById('adsbAircraftFilter')?.value || 'all';
const currentIds = new Set();
// Sort aircraft by altitude and limit to prevent DOM explosion
const sortedAircraft = Object.entries(adsbAircraft)
.filter(([_, a]) => a.lat != null && a.lon != null)
+ .filter(([icao, a]) => {
+ if (aircraftFilter === 'all') return true;
+ const militaryInfo = isMilitaryAircraft(icao, a.callsign);
+ const squawkInfo = checkSquawkCode(a);
+ if (aircraftFilter === 'military') return militaryInfo.military;
+ if (aircraftFilter === 'civil') return !militaryInfo.military;
+ if (aircraftFilter === 'emergency') return !!squawkInfo;
+ return true;
+ })
.sort((a, b) => (b[1].altitude || 0) - (a[1].altitude || 0))
.slice(0, MAX_AIRCRAFT_MARKERS);