Four changes batched: 1. ED Encounters tab (new) — multi-stage emergency note with don't-miss tooltips and 2023 E/M MDM finalize. New route /api/ed-encounters (generate per-stage + finalize MDM), new ed-encounters.js owning all client logic, new ed-encounter.html component, new template_ed memory category. Persists draft to localStorage every keystroke and to saved_encounters on stage advance. encounters.js touched only to register the new tab in sessionStorage restore + tabMap (save and idempotency code untouched). 2. Notes model selector — /notes/from-voice now accepts a client-supplied model (validated by the existing callAI allow-list); falls back to the admin default. Added <select class="tab-model-select"> to notes.html so the existing app.js populator handles options + default. 3. Remove AI-learning-from-corrections — deleted correctionTracker.js, POST /memories/correction, the corrections branch in /memories/context, the settings UI section, the FAQ entry, and all dead trackAIOutput/saveCorrection guards in callers. Legacy correction_* DB rows are filtered (NOT LIKE) rather than dropped, so no destructive migration. 4. Fix notes AI framing — /notes/from-voice prompt no longer assumes "physician dictation". Plain notes (shopping lists, reminders, ideas) now match the dictation tone instead of being forced into clinical structure. All 46 tests pass.
99 lines
7.4 KiB
HTML
99 lines
7.4 KiB
HTML
<div class="module-header">
|
|
<h2><i class="fas fa-truck-medical" style="color:#dc2626;"></i> ED Encounter</h2>
|
|
<p>Multi-stage emergency note: dictate → review → optionally add more → finalize with MDM.</p>
|
|
</div>
|
|
|
|
<!-- Save/Load bar -->
|
|
<div class="save-bar-wrap">
|
|
<div class="save-bar" id="ed-save-bar">
|
|
<div style="display:flex;align-items:center;gap:8px;flex:1;">
|
|
<i class="fas fa-tag" style="color:var(--g400);font-size:13px;"></i>
|
|
<input type="text" id="ed-label" class="save-label-input" placeholder="Patient label (e.g. Jane D, 8y abdominal pain)">
|
|
</div>
|
|
<span id="ed-stage-badge" class="model-tag" style="background:var(--g100);color:var(--g600);">Stage 1</span>
|
|
<button id="btn-ed-save" class="btn-sm btn-ghost"><i class="fas fa-floppy-disk"></i> Save draft</button>
|
|
<button id="btn-ed-load" class="btn-sm btn-ghost"><i class="fas fa-folder-open"></i> Load</button>
|
|
<button id="btn-ed-new" class="btn-sm btn-ghost" title="Clear and start new patient" style="color:var(--red);"><i class="fas fa-rotate-left"></i> New</button>
|
|
</div>
|
|
<div id="ed-load-popover" class="enc-load-popover hidden">
|
|
<div class="enc-load-popover-inner">
|
|
<input type="text" id="ed-load-search" class="enc-load-search" placeholder="Search saved encounters...">
|
|
<button class="enc-pop-close btn-sm btn-ghost"><i class="fas fa-times"></i></button>
|
|
</div>
|
|
<div id="ed-pop-list" class="enc-pop-list"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Demographics + Model -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header"><h3><i class="fas fa-user"></i> Patient Info</h3></div>
|
|
<div style="padding:12px 16px;display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;">
|
|
<div class="demo-field"><label>Age</label><input type="text" id="ed-age" placeholder="e.g., 5 years" style="width:110px;"></div>
|
|
<div class="demo-field"><label>Gender</label><select id="ed-gender"><option value="">Select</option><option>Male</option><option>Female</option><option>Non-binary/Other</option></select></div>
|
|
<div class="demo-field" style="flex:1;min-width:200px;"><label>Chief Complaint</label><input type="text" id="ed-cc" placeholder="e.g., abdominal pain, head injury, fever in infant" style="width:100%;"></div>
|
|
<div class="demo-field demo-field-model"><label><i class="fas fa-robot"></i> Model</label><select id="ed-model-select" class="tab-model-select"></select></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recording -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header">
|
|
<h3><i class="fas fa-microphone"></i> Stage <span id="ed-rec-stage-num">1</span> Recording / Dictation</h3>
|
|
<div style="display:flex;gap:6px;align-items:center;">
|
|
<button id="ed-record-btn" class="btn-sm btn-ghost"><i class="fas fa-microphone"></i> Listen In</button>
|
|
<button id="ed-pause-btn" class="btn-sm btn-ghost hidden"><i class="fas fa-pause"></i> Pause</button>
|
|
<div id="ed-rec-indicator" class="recording-indicator hidden" style="font-size:12px;"><div class="pulse-dot"></div><span>Recording... <span id="ed-timer">00:00</span></span></div>
|
|
</div>
|
|
</div>
|
|
<div style="padding:8px 16px;">
|
|
<div id="ed-transcript" class="editable-box" contenteditable="true" data-placeholder="Transcript appears here. Speak naturally — include direct asides like 'include normal cardiac exam' or 'assessment is viral URI' and the AI will route them to the right section."></div>
|
|
</div>
|
|
</div>
|
|
|
|
<button id="btn-ed-generate" class="btn-generate"><i class="fas fa-wand-magic-sparkles"></i> Generate Stage <span id="ed-gen-stage-num">1</span> Note</button>
|
|
|
|
<!-- Output: note + don't-miss panel + stage controls -->
|
|
<div id="ed-note-output" class="card output-card hidden">
|
|
<div class="card-header output-header">
|
|
<h3><i class="fas fa-file-medical"></i> ED Note <span id="ed-note-stage-tag" class="model-tag" style="background:var(--g100);color:var(--g600);margin-left:6px;">Stage 1</span></h3>
|
|
<div class="output-actions">
|
|
<span id="ed-note-model-tag" class="model-tag"></span>
|
|
<button class="btn-sm btn-primary" data-action="copy" data-target="ed-note-text"><i class="fas fa-copy"></i> Copy</button>
|
|
<button class="btn-sm btn-ghost" data-action="speak" data-target="ed-note-text"><i class="fas fa-volume-high"></i> Read</button>
|
|
</div>
|
|
</div>
|
|
<div id="ed-note-text" class="output-text" contenteditable="true"></div>
|
|
<div class="refine-bar">
|
|
<textarea id="ed-refine-input" class="refine-input" rows="2" placeholder="Tell AI to modify (e.g., 'add that patient received Zofran')"></textarea>
|
|
<button class="btn-sm btn-primary" id="ed-refine-btn"><i class="fas fa-edit"></i> Refine</button>
|
|
<button class="btn-sm btn-ghost" id="ed-shorten-btn"><i class="fas fa-compress"></i> Shorter</button>
|
|
</div>
|
|
|
|
<!-- Stage controls — appear after note generation -->
|
|
<div id="ed-stage-controls" style="padding:12px 16px;border-top:1px solid var(--g100);display:flex;gap:8px;flex-wrap:wrap;align-items:center;">
|
|
<button id="btn-ed-add-more" class="btn-sm btn-primary"><i class="fas fa-plus"></i> Add more (next stage)</button>
|
|
<button id="btn-ed-finalize" class="btn-sm" style="background:var(--green);color:white;border:none;"><i class="fas fa-check-double"></i> Save & Done (with MDM)</button>
|
|
<span style="font-size:11px;color:var(--g500);">Stages auto-save as drafts. "Done" generates the MDM block and locks the encounter.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Don't-miss panel (rendered next to the note via ed-encounters.js) -->
|
|
<div id="ed-dontmiss-card" class="card hidden" style="margin-top:10px;border-left:3px solid #f59e0b;">
|
|
<div class="card-header">
|
|
<h3><i class="fas fa-triangle-exclamation" style="color:#f59e0b;"></i> Don't Miss</h3>
|
|
<span style="font-size:11px;color:var(--g500);">High-yield items tailored to the chief complaint and age. Suggestions only.</span>
|
|
</div>
|
|
<div id="ed-dontmiss-list" style="padding:8px 16px;"></div>
|
|
</div>
|
|
|
|
<!-- MDM block (rendered after finalize) -->
|
|
<div id="ed-mdm-card" class="card hidden" style="margin-top:10px;border-left:3px solid var(--green);">
|
|
<div class="card-header output-header">
|
|
<h3><i class="fas fa-file-invoice-dollar"></i> Medical Decision Making (2023 E/M)</h3>
|
|
<div class="output-actions">
|
|
<span id="ed-mdm-level-tag" class="model-tag" style="background:var(--green-light);color:var(--green);"></span>
|
|
<button class="btn-sm btn-primary" data-action="copy" data-target="ed-mdm-text"><i class="fas fa-copy"></i> Copy</button>
|
|
</div>
|
|
</div>
|
|
<div id="ed-mdm-text" class="output-text"></div>
|
|
</div>
|