Remove RAW_DATA fallback and show a log-unavailable message
- Drop the embedded 20-contact RAW_DATA sample; the logbook now comes only from data/k5bss-log.json - Show a banner and table message when the log fails to load, and display "—" for the header stats - Skip building the dashboard when there is no data (it crashed on an empty log) and guard the activity chart redraw on resize - Compute the QSO count from the log instead of hardcoding it Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
38f38c89fe
commit
3d9c5c4b2b
3 files changed
+34
-8
No files matched your search
@@ -193,6 +193,19 @@
|
|||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.log-error {
|
||||||
|
background: var(--surface);
|
||||||
|
border: 1px solid var(--red);
|
||||||
|
border-radius: 4px;
|
||||||
|
color: var(--red);
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
font-size: 0.85rem;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
.log-error[hidden] { display: none; }
|
||||||
|
|
||||||
.section { display: none; }
|
.section { display: none; }
|
||||||
.section.active { display: block; }
|
.section.active { display: block; }
|
||||||
|
|
||||||
|
|||||||
+16
-7
@@ -1,12 +1,11 @@
|
|||||||
// ─── DATA ───────────────────────────────────────────────────
|
// ─── DATA ───────────────────────────────────────────────────
|
||||||
const RAW_DATA = [{"call":"WE2M","name":"ROBERT A HOGUE","date":"2021-01-24","time":"0553","band":"40M","mode":"FT8","rst_sent":"-20","rst_rcvd":"-10","country":"United States","state":"WA","qth":"E WENATCHEE","lotw":"Y","dist":"2782","grid":"CN97UJ"},{"call":"WD8AXA","name":"CHARLES D AGOSTI","date":"2021-01-24","time":"0555","band":"40M","mode":"FT8","rst_sent":"-07","rst_rcvd":"-11","country":"United States","state":"MI","qth":"PORTAGE","lotw":"N","dist":"1291","grid":"EN72ef"},{"call":"KG4IXS","name":"RICHARD A VAUGHAN","date":"2021-01-24","time":"0558","band":"40M","mode":"FT8","rst_sent":"+00","rst_rcvd":"-13","country":"United States","state":"VA","qth":"CHATHAM","lotw":"Y","dist":"1390","grid":"FM06HU"},{"call":"KE0DC","name":"","date":"2021-01-24","time":"0600","band":"40M","mode":"FT8","rst_sent":"-08","rst_rcvd":"-09","country":"United States","state":"CO","qth":"AURORA","lotw":"Y","dist":"1274","grid":"DM79OQ"},{"call":"KC0HHN","name":"","date":"2021-01-24","time":"0604","band":"40M","mode":"FT8","rst_sent":"-12","rst_rcvd":"-08","country":"United States","state":"IA","qth":"","lotw":"N","dist":"","grid":"EN31"},{"call":"WB0OEW","name":"JAMES D VOGT","date":"2021-01-24","time":"0606","band":"40M","mode":"FT8","rst_sent":"-10","rst_rcvd":"-15","country":"United States","state":"MO","qth":"CAMDENTON","lotw":"Y","dist":"747","grid":"EM37TH"},{"call":"N4JKO","name":"GARY E HORTON","date":"2021-01-24","time":"0608","band":"40M","mode":"FT8","rst_sent":"-12","rst_rcvd":"-15","country":"United States","state":"TN","qth":"","lotw":"N","dist":"","grid":"EM65RT"},{"call":"WW4LL","name":"LESTER P LEEPER","date":"2021-01-24","time":"0610","band":"40M","mode":"FT8","rst_sent":"-14","rst_rcvd":"-13","country":"United States","state":"GA","qth":"BOWDON","lotw":"Y","dist":"575","grid":"EM73DS"},{"call":"K0MBT","name":"MICHAEL B TEDESCO","date":"2021-01-24","time":"0612","band":"40M","mode":"FT8","rst_sent":"-09","rst_rcvd":"-18","country":"United States","state":"MN","qth":"SHAKOPEE","lotw":"Y","dist":"1247","grid":"EN34HE"},{"call":"WB4LHD","name":"ROY A MCDANIEL","date":"2021-01-24","time":"0618","band":"40M","mode":"FT8","rst_sent":"-14","rst_rcvd":"-12","country":"United States","state":"NC","qth":"SANFORD","lotw":"Y","dist":"1118","grid":"FM03HF"},{"call":"N0KJA","name":"FRANK O KORANDA","date":"2021-01-24","time":"0620","band":"40M","mode":"FT8","rst_sent":"-10","rst_rcvd":"-14","country":"United States","state":"KS","qth":"WICHITA","lotw":"Y","dist":"641","grid":"EM17PT"},{"call":"W9JML","name":"JAMES M LAURENDEAU","date":"2021-01-24","time":"0623","band":"40M","mode":"FT8","rst_sent":"-05","rst_rcvd":"-16","country":"United States","state":"IL","qth":"COLLINSVILLE","lotw":"Y","dist":"668","grid":"EM58GI"},{"call":"K9ADV","name":"DWIGHT A VANDERLINDEN","date":"2021-01-24","time":"0625","band":"40M","mode":"FT8","rst_sent":"-11","rst_rcvd":"-13","country":"United States","state":"IN","qth":"INDIANAPOLIS","lotw":"Y","dist":"929","grid":"EM79MF"},{"call":"WB8YYY","name":"ERNEST E MUENZER","date":"2021-01-24","time":"0628","band":"40M","mode":"FT8","rst_sent":"-10","rst_rcvd":"-05","country":"United States","state":"MI","qth":"","lotw":"Y","dist":"","grid":"EN72"},{"call":"KD2UKS","name":"RAYMOND JOSEPH MCDERMOTT","date":"2021-01-24","time":"0641","band":"40M","mode":"FT8","rst_sent":"-12","rst_rcvd":"-15","country":"United States","state":"NY","qth":"MASTIC","lotw":"N","dist":"1561","grid":"FN30HT"},{"call":"KD8IYI","name":"JEFFREY C WHITLEY","date":"2021-01-24","time":"0644","band":"40M","mode":"FT8","rst_sent":"-13","rst_rcvd":"-13","country":"United States","state":"OH","qth":"","lotw":"Y","dist":"","grid":"EM89LG"},{"call":"K9DW","name":"DAN WELBORN","date":"2021-01-24","time":"0647","band":"40M","mode":"FT8","rst_sent":"-09","rst_rcvd":"-06","country":"United States","state":"AL","qth":"DOTHAN","lotw":"Y","dist":"435","grid":"EM64SA"},{"call":"K8DO","name":"DEAN L OSTERMAN","date":"2021-01-24","time":"0649","band":"40M","mode":"FT8","rst_sent":"-11","rst_rcvd":"-10","country":"United States","state":"MI","qth":"ALLENDALE","lotw":"Y","dist":"1298","grid":"EN62OX"},{"call":"K6VMV","name":"VICTOR M VALADEZ","date":"2021-01-24","time":"0651","band":"40M","mode":"FT8","rst_sent":"-08","rst_rcvd":"-12","country":"United States","state":"CA","qth":"MANTECA","lotw":"N","dist":"1954","grid":"CM97KC"},{"call":"W0ULF","name":"MIKE WOLFE","date":"2021-01-24","time":"0653","band":"40M","mode":"FT8","rst_sent":"-11","rst_rcvd":"-13","country":"United States","state":"NE","qth":"OMAHA","lotw":"Y","dist":"1012","grid":"EN21WC"}];
|
|
||||||
|
|
||||||
let ALL_DATA = [];
|
let ALL_DATA = [];
|
||||||
let filteredData = [];
|
let filteredData = [];
|
||||||
let sortKey = 'date';
|
let sortKey = 'date';
|
||||||
let sortDir = -1; // -1 = desc
|
let sortDir = -1; // -1 = desc
|
||||||
let currentPage = 1;
|
let currentPage = 1;
|
||||||
const PAGE_SIZE = 50;
|
const PAGE_SIZE = 50;
|
||||||
|
let logUnavailable = false;
|
||||||
|
|
||||||
// ─── FULL LOG ────────────────────────────────────────────────
|
// ─── FULL LOG ────────────────────────────────────────────────
|
||||||
const FULL_LOG_URL = 'data/k5bss-log.json';
|
const FULL_LOG_URL = 'data/k5bss-log.json';
|
||||||
@@ -17,19 +16,27 @@ async function loadFullLog() {
|
|||||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||||
return await res.json();
|
return await res.json();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn('Could not load full log, using sample data:', err);
|
console.warn('Could not load full log:', err);
|
||||||
return [];
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
const fullLog = await loadFullLog();
|
const log = await loadFullLog();
|
||||||
ALL_DATA = fullLog.length ? fullLog : RAW_DATA;
|
logUnavailable = !log;
|
||||||
|
ALL_DATA = log || [];
|
||||||
filteredData = [...ALL_DATA];
|
filteredData = [...ALL_DATA];
|
||||||
|
|
||||||
|
if (logUnavailable) {
|
||||||
|
document.getElementById('log-error').hidden = false;
|
||||||
|
renderTable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Update stats
|
// Update stats
|
||||||
const countries = new Set(ALL_DATA.map(r => r.country).filter(Boolean));
|
const countries = new Set(ALL_DATA.map(r => r.country).filter(Boolean));
|
||||||
const states = new Set(ALL_DATA.filter(r => r.country === 'United States').map(r => r.state).filter(Boolean));
|
const states = new Set(ALL_DATA.filter(r => r.country === 'United States').map(r => r.state).filter(Boolean));
|
||||||
|
document.getElementById('stat-qso').textContent = ALL_DATA.length.toLocaleString();
|
||||||
document.getElementById('stat-dxcc').textContent = countries.size;
|
document.getElementById('stat-dxcc').textContent = countries.size;
|
||||||
document.getElementById('stat-states').textContent = states.size;
|
document.getElementById('stat-states').textContent = states.size;
|
||||||
|
|
||||||
@@ -90,6 +97,7 @@ function buildDashboard() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function drawActivityChart() {
|
function drawActivityChart() {
|
||||||
|
if (!ALL_DATA.length) return;
|
||||||
const canvas = document.getElementById('activityCanvas');
|
const canvas = document.getElementById('activityCanvas');
|
||||||
const dpr = window.devicePixelRatio || 1;
|
const dpr = window.devicePixelRatio || 1;
|
||||||
const W = canvas.parentElement.offsetWidth - 48;
|
const W = canvas.parentElement.offsetWidth - 48;
|
||||||
@@ -219,7 +227,8 @@ function renderTable() {
|
|||||||
`${total.toLocaleString()} QSOs · Page ${currentPage} of ${Math.max(1,pages)}`;
|
`${total.toLocaleString()} QSOs · Page ${currentPage} of ${Math.max(1,pages)}`;
|
||||||
|
|
||||||
if (slice.length === 0) {
|
if (slice.length === 0) {
|
||||||
tbody.innerHTML = '<tr><td colspan="10" style="text-align:center;padding:2rem;color:var(--muted);font-family:var(--font-mono);font-size:0.8rem;">NO CONTACTS FOUND</td></tr>';
|
const msg = logUnavailable ? 'LOG UNAVAILABLE — TRY AGAIN LATER' : 'NO CONTACTS FOUND';
|
||||||
|
tbody.innerHTML = `<tr><td colspan="10" style="text-align:center;padding:2rem;color:var(--muted);font-family:var(--font-mono);font-size:0.8rem;">${msg}</td></tr>`;
|
||||||
} else {
|
} else {
|
||||||
tbody.innerHTML = slice.map(r => {
|
tbody.innerHTML = slice.map(r => {
|
||||||
const timeStr = r.time ? r.time.slice(0,2)+':'+r.time.slice(2,4) : '';
|
const timeStr = r.time ? r.time.slice(0,2)+':'+r.time.slice(2,4) : '';
|
||||||
|
|||||||
+5
-1
@@ -30,7 +30,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="header-status">
|
<div class="header-status">
|
||||||
<div class="status-item">
|
<div class="status-item">
|
||||||
<span class="status-val" id="stat-qso">2,112</span>
|
<span class="status-val" id="stat-qso">—</span>
|
||||||
<span class="status-lbl">QSOs Logged</span>
|
<span class="status-lbl">QSOs Logged</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="status-item">
|
<div class="status-item">
|
||||||
@@ -59,6 +59,10 @@
|
|||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
|
||||||
|
<div class="log-error" id="log-error" role="alert" hidden>
|
||||||
|
⚠ LOG UNAVAILABLE — The logbook could not be loaded. Try again later.
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- DASHBOARD -->
|
<!-- DASHBOARD -->
|
||||||
<div id="section-dashboard" class="section active">
|
<div id="section-dashboard" class="section active">
|
||||||
<div class="dash-grid">
|
<div class="dash-grid">
|
||||||
|
|||||||
Reference in new issue
Block a user