Rttningar
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>heardlog ??? APRS RF Coverage</title>
|
||||
<title>heardlog – APRS RF Coverage</title>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.css">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.js"></script>
|
||||
<style>
|
||||
@@ -115,10 +115,10 @@
|
||||
<header>
|
||||
<div class="logo">heard<span>log</span> — <em>APRS RF COVERAGE</em></div>
|
||||
<div class="controls">
|
||||
<div class="stat">SQUARES <strong id="sq-count" onclick="toggleSquaresPanel()">???</strong></div>
|
||||
<div class="stat">POSITIONS <strong id="pt-count">???</strong></div>
|
||||
<div class="stat">SQUARES <strong id="sq-count" onclick="toggleSquaresPanel()">–</strong></div>
|
||||
<div class="stat">POSITIONS <strong id="pt-count">–</strong></div>
|
||||
<div class="stat">RX <strong>SA6ANW-1</strong></div>
|
||||
<button class="btn" onclick="refresh()">??? REFRESH</button>
|
||||
<button class="btn" onclick="refresh()">↻ REFRESH</button>
|
||||
</div>
|
||||
</header>
|
||||
<div id="map"></div>
|
||||
@@ -167,7 +167,7 @@ async function fetchAll() {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Popup HTML ??? square view + station view both in DOM, toggled with CSS
|
||||
// Popup HTML – square view + station view both in DOM, toggled with CSS
|
||||
// ---------------------------------------------------------------------------
|
||||
function makePopupHTML(sq) {
|
||||
const pathRows = sq.paths.map(p => {
|
||||
@@ -242,7 +242,7 @@ async function showStation(sqId, callsign) {
|
||||
try {
|
||||
const res = await fetch(`${API}/api/coverage/station/${encodeURIComponent(callsign)}`);
|
||||
const d = await res.json();
|
||||
const fmt = iso => iso ? new Date(iso).toLocaleString('sv-SE',{dateStyle:'short',timeStyle:'short'}) : '???';
|
||||
const fmt = iso => iso ? new Date(iso).toLocaleString('sv-SE',{dateStyle:'short',timeStyle:'short'}) : '–';
|
||||
const topPaths = (d.top_paths||[]).map(p =>
|
||||
`<div class="detail-row"><span class="detail-label">${p.path}</span><span class="detail-value">${p.count}</span></div>`
|
||||
).join('');
|
||||
@@ -253,16 +253,16 @@ async function showStation(sqId, callsign) {
|
||||
<div class="detail-row"><span class="detail-label">Unique positions</span><span class="detail-value">${d.unique_positions}</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Unique paths</span><span class="detail-value">${d.unique_paths}</span></div>
|
||||
<div class="detail-section">DISTANCE (LINE OF SIGHT)</div>
|
||||
<div class="detail-row"><span class="detail-label">Closest</span><span class="detail-value">${d.distance_min_km??'???'} km</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Farthest</span><span class="detail-value">${d.distance_max_km??'???'} km</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Average</span><span class="detail-value">${d.distance_avg_km??'???'} km</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Closest</span><span class="detail-value">${d.distance_min_km??'–'} km</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Farthest</span><span class="detail-value">${d.distance_max_km??'–'} km</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Average</span><span class="detail-value">${d.distance_avg_km??'–'} km</span></div>
|
||||
<div class="detail-section">TIMESTAMPS</div>
|
||||
<div class="detail-row"><span class="detail-label">First heard</span><span class="detail-value">${fmt(d.first_heard)}</span></div>
|
||||
<div class="detail-row"><span class="detail-label">Last heard</span><span class="detail-value">${fmt(d.last_heard)}</span></div>
|
||||
<div class="detail-section">TOP PATHS</div>
|
||||
${topPaths}
|
||||
<div class="detail-section">SQUARES</div>
|
||||
<div class="squares-list">${(d.squares||[]).join(' ') || '???'}</div>`;
|
||||
<div class="squares-list">${(d.squares||[]).join(' ') || '–'}</div>`;
|
||||
} catch(e) {
|
||||
body.innerHTML = '<div class="loading-msg">Failed to load data.</div>';
|
||||
}
|
||||
@@ -509,7 +509,7 @@ function clearPathLines() {
|
||||
function drawPath(rawPath, stationLat, stationLon) {
|
||||
clearPathLines();
|
||||
|
||||
// Build waypoints: station ??? each digi ??? RX
|
||||
// Build waypoints: station → each digi → RX
|
||||
const waypoints = [{ lat: stationLat, lon: stationLon, label: 'Station' }];
|
||||
|
||||
if (rawPath && rawPath !== 'DIRECT') {
|
||||
@@ -613,8 +613,8 @@ map.on('popupopen', e => {
|
||||
map.on('zoomend', renderLayers);
|
||||
|
||||
async function refresh() {
|
||||
document.getElementById('sq-count').textContent = '???';
|
||||
document.getElementById('pt-count').textContent = '???';
|
||||
document.getElementById('sq-count').textContent = '…';
|
||||
document.getElementById('pt-count').textContent = '…';
|
||||
await fetchAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
server {
|
||||
listen 80;
|
||||
charset utf-8;
|
||||
source_charset utf-8;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
|
||||
Reference in New Issue
Block a user