Replace API fetch with seeded demo data for standalone use
This commit is contained in:
parent
2835d375dd
commit
1c12169393
1 changed files with 55 additions and 19 deletions
74
index.html
74
index.html
|
|
@ -511,32 +511,68 @@ body {
|
|||
return result;
|
||||
}
|
||||
|
||||
// ─── Demo Data ──────────────────────────────────────────────────────
|
||||
const DEMO_P1 = [
|
||||
{ time: '7:00A', type: 'MRI', title: 'BRAIN W/O CONTRAST', src: 'OP', body_part: 'BRAIN', pt: 'J.D.', scr: true, ins: true },
|
||||
{ time: '7:30A', type: 'MRI', title: 'C-SPINE W/ CONTRAST', src: 'ER', body_part: 'CERVICAL SPINE', pt: 'K.L.', scr: true, ins: true },
|
||||
{ time: '8:00A', type: 'CT', title: 'CHEST W/ CONTRAST', src: 'ER', body_part: 'CHEST', pt: 'M.S.', scr: true, ins: false },
|
||||
{ time: '8:30A', type: 'CT', title: 'ABD/PELVIS W/O', src: 'IP', body_part: 'ABDOMEN/PELVIS', pt: 'R.T.', scr: true, ins: true },
|
||||
{ time: '9:00A', type: 'XRAY', title: 'LEFT HAND 3 VIEW', src: 'OP', body_part: 'LEFT HAND', pt: 'A.B.', scr: false, ins: true },
|
||||
{ time: '9:15A', type: 'XRAY', title: 'CHEST PA+LAT', src: 'OP', body_part: 'CHEST', pt: 'C.W.', scr: true, ins: true },
|
||||
{ time: '9:30A', type: 'US', title: 'ABDOMEN COMPLETE', src: 'OP', body_part: 'ABDOMEN', pt: 'D.F.', scr: true, ins: true },
|
||||
{ time: '10:00', type: 'MRI', title: 'KNEE W/O CONTRAST', src: 'OP', body_part: 'RIGHT KNEE', pt: 'E.G.', scr: true, ins: false },
|
||||
{ time: '10:30', type: 'CT', title: 'HEAD W/O CONTRAST', src: 'ER', body_part: 'HEAD', pt: 'H.J.', scr: true, ins: true },
|
||||
{ time: '11:00', type: 'FLUOR', title: 'BARIUM SWALLOW', src: 'OP', body_part: 'ESOPHAGUS', pt: 'P.Q.', scr: true, ins: true },
|
||||
];
|
||||
|
||||
const DEMO_P2 = [
|
||||
{ time: '7:00A', type: 'MRI', title: 'LUMBAR SPINE W/O', src: 'OP', body_part: 'LUMBAR SPINE', pt: 'L.M.', scr: true, ins: true },
|
||||
{ time: '7:45A', type: 'MRI', title: 'SHOULDER W/ CONTRAST', src: 'OP', body_part: 'LEFT SHOULDER', pt: 'N.O.', scr: true, ins: true },
|
||||
{ time: '8:30A', type: 'CT', title: 'CHEST/ABD/PEL W/', src: 'ER', body_part: 'CHEST+ABD+PEL', pt: 'S.T.', scr: false, ins: true },
|
||||
{ time: '9:00A', type: 'US', title: 'THYROID COMPLETE', src: 'OP', body_part: 'THYROID', pt: 'U.V.', scr: true, ins: true },
|
||||
{ time: '9:30A', type: 'XRAY', title: 'ANKLE 3 VIEW', src: 'ER', body_part: 'RIGHT ANKLE', pt: 'W.X.', scr: true, ins: false },
|
||||
{ time: '10:00', type: 'MRI', title: 'BRAIN W/ + W/O', src: 'IP', body_part: 'BRAIN', pt: 'Y.Z.', scr: true, ins: true },
|
||||
{ time: '10:45', type: 'CT', title: 'SINUSES W/O', src: 'OP', body_part: 'SINUSES', pt: 'B.C.', scr: true, ins: true },
|
||||
];
|
||||
|
||||
// ─── Load Day Data ─────────────────────────────────────────────────
|
||||
let p1Rows = [];
|
||||
let p2Rows = [];
|
||||
|
||||
async function loadDay(dateStr) {
|
||||
try {
|
||||
const resp = await fetch(`/api/day/${dateStr}`);
|
||||
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
|
||||
const data = await resp.json();
|
||||
function loadDay(dateStr) {
|
||||
const d = new Date(dateStr + 'T00:00:00');
|
||||
const days = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
|
||||
const months = ['JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE',
|
||||
'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER'];
|
||||
const dayName = days[d.getDay()];
|
||||
const monthName = months[d.getMonth()];
|
||||
const dateNum = String(d.getDate()).padStart(2, '0');
|
||||
const displayDate = `${dayName}, ${monthName} ${dateNum}, ${d.getFullYear()}`;
|
||||
|
||||
setDateText(data.display_date);
|
||||
setDateText(displayDate);
|
||||
|
||||
const p1Items = data.p1 || [];
|
||||
for (let r = 0; r < MAX_ROWS; r++) {
|
||||
const text = r < p1Items.length ? formatRow(p1Items[r]) : ''.padEnd(TOTAL_CHARS);
|
||||
setTimeout(() => setRowText(p1Rows[r], text), r * 20);
|
||||
}
|
||||
// Seed a simple RNG from the date so each day looks different but is stable
|
||||
let seed = 0;
|
||||
for (let i = 0; i < dateStr.length; i++) seed = ((seed << 5) - seed + dateStr.charCodeAt(i)) | 0;
|
||||
function rand() { seed = (seed * 16807 + 0) % 2147483647; return (seed & 0x7fffffff) / 2147483647; }
|
||||
|
||||
const p2Items = data.p2 || [];
|
||||
for (let r = 0; r < MAX_ROWS; r++) {
|
||||
const text = r < p2Items.length ? formatRow(p2Items[r]) : ''.padEnd(TOTAL_CHARS);
|
||||
setTimeout(() => setRowText(p2Rows[r], text), 80 + r * 20);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to load day:', err);
|
||||
setDateText('ERROR LOADING DATA');
|
||||
// Shuffle and slice demo data per day
|
||||
function pick(arr) {
|
||||
const shuffled = arr.slice().sort(() => rand() - 0.5);
|
||||
const count = 3 + Math.floor(rand() * (shuffled.length - 2));
|
||||
return shuffled.slice(0, count);
|
||||
}
|
||||
|
||||
const p1Items = pick(DEMO_P1);
|
||||
for (let r = 0; r < MAX_ROWS; r++) {
|
||||
const text = r < p1Items.length ? formatRow(p1Items[r]) : ''.padEnd(TOTAL_CHARS);
|
||||
setTimeout(() => setRowText(p1Rows[r], text), r * 20);
|
||||
}
|
||||
|
||||
const p2Items = pick(DEMO_P2);
|
||||
for (let r = 0; r < MAX_ROWS; r++) {
|
||||
const text = r < p2Items.length ? formatRow(p2Items[r]) : ''.padEnd(TOTAL_CHARS);
|
||||
setTimeout(() => setRowText(p2Rows[r], text), 80 + r * 20);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue