pediatric-ai-scribe-v3/public/js/bedside/age-weight.js
Daniel 031bfb995a feat: C — extract Bedside reference into ES modules
Split the Bedside clinical reference section out of calculators.js
(~1220 lines) into 20 focused ES modules under public/js/bedside/.
Each module owns one clinical topic (cardiac, seizure, sepsis, burns,
etc.) and exports an init() wired up by bedside/index.js. Shared
helpers live in shared.js and also set window._EM for back-compat
with the 4 remaining call sites in calculators.js.

Load order: classic defer calculators.js first, then module script
bedside/index.js. Handlers bind at DOM-ready; runtime _EM lookups
resolve after both are evaluated.

Makes bedside content editable per-section, shrinks calculators.js
from 4111 to 2891 lines, and keeps the existing Playwright smoke
suite (e2e/tests/bedside-smoke.spec.js) as the behavioral contract.
2026-04-20 23:19:50 +02:00

80 lines
3.5 KiB
JavaScript

// ============================================================
// bedside/age-weight.js
// BEDSIDE — AGE → WEIGHT (single source for all sub-sections).
// Top estimator wiring: #bedside-age, #bedside-formula,
// #bedside-weight, #btn-bedside-clear.
// ============================================================
export function init() {
document.addEventListener('input', function(e) {
if (e.target && e.target.id === 'bedside-age') recomputeFromAge();
if (e.target && e.target.id === 'bedside-weight') {
e.target.dataset.userTyped = '1';
}
});
document.addEventListener('change', function(e) {
if (e.target && e.target.id === 'bedside-formula') recomputeFromAge(true);
});
document.addEventListener('click', function(e) {
if (e.target.closest && e.target.closest('#btn-bedside-clear')) {
document.getElementById('bedside-age').value = '';
var wtField = document.getElementById('bedside-weight');
wtField.value = '';
delete wtField.dataset.userTyped;
var note = document.getElementById('bedside-estimate-note');
if (note) note.innerHTML = '';
}
});
// Recompute weight from age using the currently selected formula.
// If forceFromFormula is true (formula dropdown changed), overwrite even user-typed weight.
function recomputeFromAge(forceFromFormula) {
var raw = document.getElementById('bedside-age').value;
var note = document.getElementById('bedside-estimate-note');
if (!raw || !raw.trim()) { if (note) note.innerHTML = ''; return; }
var months = window._parseAgeMonths ? window._parseAgeMonths(raw) : null;
if (months == null || isNaN(months) || months < 0) {
if (note) note.innerHTML = '<span style="color:var(--red);">Could not parse age. Try "3y", "18 months", "15 days".</span>';
return;
}
var formula = document.getElementById('bedside-formula').value;
var est = window._PED_MATH.estimateWeightFromAgeMonths(months);
var pickedWeight = formula === 'bestguess' ? est.all.bestGuess : est.all.apls;
var pickedLabel = formula === 'bestguess' ? bestGuessBand(months) : aplsBand(months);
var wtField = document.getElementById('bedside-weight');
if (forceFromFormula || !wtField.dataset.userTyped) {
wtField.value = pickedWeight;
delete wtField.dataset.userTyped; // treat as computed again
}
var ageTxt = months < 12
? (Math.round(months * 10) / 10) + ' months'
: (Math.round(months / 12 * 10) / 10) + ' years';
if (note) note.innerHTML = '<strong>' + pickedWeight + ' kg</strong> ' +
'<span style="color:var(--g500);">(' + ageTxt + ', ' + pickedLabel + ')</span> · ' +
'APLS: ' + est.all.apls + ' kg · Best Guess: ' + est.all.bestGuess + ' kg. <em>You can override the weight field.</em>';
}
function aplsBand(m) {
if (m < 12) return 'APLS 0-12 mo';
var y = m / 12;
if (y <= 5) return 'APLS 1-5 yr';
return 'APLS 6-12 yr';
}
function bestGuessBand(m) {
if (m < 12) return 'Best Guess 1-11 mo';
var y = m / 12;
if (y <= 5) return 'Best Guess 1-4 yr';
return 'Best Guess 5-14 yr';
}
// Top bedside weight is estimator-only. Sections have their own weight fields and
// read them directly (no auto-propagation). Expose the reader on window for
// safety (some older code paths may look it up).
if (typeof window !== 'undefined') {
window._getBedsideWeight = function() {
var el = document.getElementById('bedside-weight');
return el ? parseFloat(el.value) || null : null;
};
}
}