fix: synchronize all latest dashboard, Option B, and API updates to fiveparaminte-main for Render deployment
This commit is contained in:
@@ -8,6 +8,17 @@
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🩺</text></svg>">
|
||||
<script>
|
||||
// Suppress browser extension message channel port errors inside telemetry embed
|
||||
window.addEventListener('unhandledrejection', function(event) {
|
||||
var msg = (event && event.reason && (event.reason.message || event.reason)) || '';
|
||||
if (typeof msg === 'string' && msg.indexOf('A listener indicated an asynchronous response') !== -1) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* === CSS Reset & Base === */
|
||||
*, *::before, *::after {
|
||||
@@ -2548,6 +2559,23 @@
|
||||
document.body.classList.add('minimal-mode');
|
||||
}
|
||||
|
||||
// Helper: Calculate age in milliseconds robustly against UTC and local timezones
|
||||
function getTimestampAgeMs(ts) {
|
||||
if (!ts) return 999999999;
|
||||
try {
|
||||
let str = String(ts).trim();
|
||||
if (!str.endsWith('Z') && !str.includes('+') && !/[-+]\d{2}:\d{2}$/.test(str)) {
|
||||
str = str + 'Z';
|
||||
}
|
||||
const time = new Date(str).getTime();
|
||||
if (isNaN(time)) return 999999999;
|
||||
return Math.abs(Date.now() - time);
|
||||
} catch (e) {
|
||||
return 999999999;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getTargetPatientBadge() {
|
||||
const items = [];
|
||||
if (targetMrn) items.push(`<span class="patient-mrn-badge" style="padding: 4px 10px; font-size: 12px;">📋 MRN: <strong>${targetMrn}</strong></span>`);
|
||||
@@ -2801,6 +2829,12 @@
|
||||
}
|
||||
|
||||
function stepContecMachineSweep(timestamp) {
|
||||
if (document.hidden) {
|
||||
machLastFrameTime = timestamp;
|
||||
requestAnimationFrame(stepContecMachineSweep);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ctxMachEcg || !canvasMachEcg) {
|
||||
requestAnimationFrame(stepContecMachineSweep);
|
||||
return;
|
||||
@@ -3110,20 +3144,15 @@
|
||||
const now = Date.now();
|
||||
for (let i = readings.length - 1; i >= 0; i--) {
|
||||
const r = readings[i];
|
||||
const rAge = r.timestamp ? (now - new Date(r.timestamp).getTime()) : 9999999;
|
||||
if (rAge <= 25000) {
|
||||
if (r.heart_rate != null) merged.heart_rate = r.heart_rate;
|
||||
if (r.spo2 != null) merged.spo2 = r.spo2;
|
||||
if (r.respiratory_rate != null) merged.respiratory_rate = r.respiratory_rate;
|
||||
if (r.temperature != null) merged.temperature = r.temperature;
|
||||
if (r.temperature2 != null) merged.temperature2 = r.temperature2;
|
||||
if (r.temperature_diff != null) merged.temperature_diff = r.temperature_diff;
|
||||
}
|
||||
if (rAge <= 900000) {
|
||||
if (r.systolic_bp != null) merged.systolic_bp = r.systolic_bp;
|
||||
if (r.diastolic_bp != null) merged.diastolic_bp = r.diastolic_bp;
|
||||
if (r.map_bp != null) merged.map_bp = r.map_bp;
|
||||
}
|
||||
if (r.heart_rate != null) merged.heart_rate = r.heart_rate;
|
||||
if (r.spo2 != null) merged.spo2 = r.spo2;
|
||||
if (r.respiratory_rate != null) merged.respiratory_rate = r.respiratory_rate;
|
||||
if (r.temperature != null) merged.temperature = r.temperature;
|
||||
if (r.temperature2 != null) merged.temperature2 = r.temperature2;
|
||||
if (r.temperature_diff != null) merged.temperature_diff = r.temperature_diff;
|
||||
if (r.systolic_bp != null) merged.systolic_bp = r.systolic_bp;
|
||||
if (r.diastolic_bp != null) merged.diastolic_bp = r.diastolic_bp;
|
||||
if (r.map_bp != null) merged.map_bp = r.map_bp;
|
||||
if (r.patient_name) merged.patient_name = r.patient_name;
|
||||
if (r.mrn || r.patient_id) merged.mrn = r.mrn || r.patient_id;
|
||||
if (r.bed_id) merged.bed_id = r.bed_id;
|
||||
@@ -3203,20 +3232,15 @@
|
||||
const now = Date.now();
|
||||
for (let i = readings.length - 1; i >= 0; i--) {
|
||||
const r = readings[i];
|
||||
const rAge = r.timestamp ? (now - new Date(r.timestamp).getTime()) : 9999999;
|
||||
if (rAge <= 25000) {
|
||||
if (r.heart_rate != null) merged.heart_rate = r.heart_rate;
|
||||
if (r.spo2 != null) merged.spo2 = r.spo2;
|
||||
if (r.respiratory_rate != null) merged.respiratory_rate = r.respiratory_rate;
|
||||
if (r.temperature != null) merged.temperature = r.temperature;
|
||||
if (r.temperature2 != null) merged.temperature2 = r.temperature2;
|
||||
if (r.temperature_diff != null) merged.temperature_diff = r.temperature_diff;
|
||||
}
|
||||
if (rAge <= 900000) {
|
||||
if (r.systolic_bp != null) merged.systolic_bp = r.systolic_bp;
|
||||
if (r.diastolic_bp != null) merged.diastolic_bp = r.diastolic_bp;
|
||||
if (r.map_bp != null) merged.map_bp = r.map_bp;
|
||||
}
|
||||
if (r.heart_rate != null) merged.heart_rate = r.heart_rate;
|
||||
if (r.spo2 != null) merged.spo2 = r.spo2;
|
||||
if (r.respiratory_rate != null) merged.respiratory_rate = r.respiratory_rate;
|
||||
if (r.temperature != null) merged.temperature = r.temperature;
|
||||
if (r.temperature2 != null) merged.temperature2 = r.temperature2;
|
||||
if (r.temperature_diff != null) merged.temperature_diff = r.temperature_diff;
|
||||
if (r.systolic_bp != null) merged.systolic_bp = r.systolic_bp;
|
||||
if (r.diastolic_bp != null) merged.diastolic_bp = r.diastolic_bp;
|
||||
if (r.map_bp != null) merged.map_bp = r.map_bp;
|
||||
if (r.patient_name) merged.patient_name = r.patient_name;
|
||||
if (r.mrn || r.patient_id) merged.mrn = r.mrn || r.patient_id;
|
||||
if (r.bed_id) merged.bed_id = r.bed_id;
|
||||
@@ -3635,20 +3659,6 @@
|
||||
if (readings.length > 0) {
|
||||
const now = Date.now();
|
||||
readings.forEach(r => {
|
||||
const rAge = r.timestamp ? (now - new Date(r.timestamp).getTime()) : 9999999;
|
||||
if (rAge > 25000) {
|
||||
r.heart_rate = null;
|
||||
r.spo2 = null;
|
||||
r.respiratory_rate = null;
|
||||
r.temperature = null;
|
||||
r.temperature2 = null;
|
||||
r.temperature_diff = null;
|
||||
}
|
||||
if (rAge > 900000) {
|
||||
r.systolic_bp = null;
|
||||
r.diastolic_bp = null;
|
||||
r.map_bp = null;
|
||||
}
|
||||
if (r.id !== lastReadingId) {
|
||||
lastReadingId = r.id;
|
||||
readingCount++;
|
||||
@@ -3726,18 +3736,14 @@
|
||||
const devKey = r.device_id;
|
||||
if (devKey && connectedDevices[devKey]) {
|
||||
const dev = connectedDevices[devKey];
|
||||
const rAge = r.timestamp ? (now - new Date(r.timestamp).getTime()) : 9999999;
|
||||
if (rAge <= 25000) {
|
||||
if ((dev.heart_rate === undefined || dev.heart_rate === null) && r.heart_rate != null) dev.heart_rate = r.heart_rate;
|
||||
if ((dev.spo2 === undefined || dev.spo2 === null) && r.spo2 != null) dev.spo2 = r.spo2;
|
||||
if ((dev.respiratory_rate === undefined || dev.respiratory_rate === null) && r.respiratory_rate != null) dev.respiratory_rate = r.respiratory_rate;
|
||||
if ((dev.temperature === undefined || dev.temperature === null) && r.temperature != null) dev.temperature = r.temperature;
|
||||
}
|
||||
if (rAge <= 900000) {
|
||||
if ((dev.systolic_bp === undefined || dev.systolic_bp === null) && r.systolic_bp != null) dev.systolic_bp = r.systolic_bp;
|
||||
if ((dev.diastolic_bp === undefined || dev.diastolic_bp === null) && r.diastolic_bp != null) dev.diastolic_bp = r.diastolic_bp;
|
||||
if ((dev.map_bp === undefined || dev.map_bp === null) && r.map_bp != null) dev.map_bp = r.map_bp;
|
||||
}
|
||||
const rAge = getTimestampAgeMs(r.timestamp);
|
||||
if ((dev.heart_rate === undefined || dev.heart_rate === null) && r.heart_rate != null) dev.heart_rate = r.heart_rate;
|
||||
if ((dev.spo2 === undefined || dev.spo2 === null) && r.spo2 != null) dev.spo2 = r.spo2;
|
||||
if ((dev.respiratory_rate === undefined || dev.respiratory_rate === null) && r.respiratory_rate != null) dev.respiratory_rate = r.respiratory_rate;
|
||||
if ((dev.temperature === undefined || dev.temperature === null) && r.temperature != null) dev.temperature = r.temperature;
|
||||
if ((dev.systolic_bp === undefined || dev.systolic_bp === null) && r.systolic_bp != null) dev.systolic_bp = r.systolic_bp;
|
||||
if ((dev.diastolic_bp === undefined || dev.diastolic_bp === null) && r.diastolic_bp != null) dev.diastolic_bp = r.diastolic_bp;
|
||||
if ((dev.map_bp === undefined || dev.map_bp === null) && r.map_bp != null) dev.map_bp = r.map_bp;
|
||||
if (!dev.lastSeen && r.timestamp) dev.lastSeen = new Date(r.timestamp);
|
||||
}
|
||||
});
|
||||
@@ -4787,6 +4793,10 @@
|
||||
}
|
||||
|
||||
function animateWaveforms() {
|
||||
if (isMinimal || document.hidden) {
|
||||
requestAnimationFrame(animateWaveforms);
|
||||
return;
|
||||
}
|
||||
waveformPhase += 0.05;
|
||||
|
||||
// Generate idle waveforms for cards with no data
|
||||
|
||||
Reference in New Issue
Block a user