pdf-parse (was v2, broken API): - Downgraded to v1.1.1 — default export is a function again - pdfParse is not a function error fixed WebDAV file selection (style.display bug, same cascade issue): - lh-ai-webdav-selected had inline style="display:flex" always visible - selectWebdavFile() / deselectWebdavFile() now use element.style.display - On select: browser div hides, selected indicator shows with file name + X - On deselect (X): indicator hides, browser shows again Topic context for Upload and Nextcloud tabs: - Both tabs now have optional "Topic / context" field - Sent to backend as 'topic' param to help AI focus the generated content Inline refine bar (replaces window.prompt): - Refine Body button shows/hides an amber inline input bar below generate buttons - Enter instructions, press Apply — no browser dialog, works in all contexts CSP: remove unsafe-inline from scriptSrc (security issue #2): - Converted all 26 onclick= handlers in component HTML files to data-action / data-target / data-label attributes - Added delegated click handler in app.js for copy/speak/nc-export actions - script-src now 'self' only; script-src-attr 'none' WebDAV path endpoint (security issue #5): - New POST /api/user/webdav-path (authMiddleware only, not moderator) - nextcloud.js updated to use new endpoint nodemailer: already at 6.10.1 (vulnerability fixed).
107 lines
7.1 KiB
HTML
107 lines
7.1 KiB
HTML
<div class="module-header">
|
|
<h2><i class="fas fa-thermometer-half"></i> Sick Visit Note</h2>
|
|
<p>Quick sick visit documentation with auto-suggested ROS and PE systems</p>
|
|
</div>
|
|
|
|
<!-- Save/Load bar -->
|
|
<div class="save-bar-wrap">
|
|
<div class="save-bar" id="sick-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="sick-label" class="save-label-input" placeholder="Patient label (e.g. John D, 5y fever)">
|
|
</div>
|
|
<button id="btn-sick-save" class="btn-sm btn-ghost"><i class="fas fa-floppy-disk"></i> Save</button>
|
|
<button id="btn-sick-load" class="btn-sm btn-ghost"><i class="fas fa-folder-open"></i> Load</button>
|
|
<button id="btn-sick-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="sick-load-popover" class="enc-load-popover hidden">
|
|
<div class="enc-load-popover-inner">
|
|
<input type="text" id="sick-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="sick-pop-list" class="enc-pop-list"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Demographics -->
|
|
<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="sick-age" placeholder="e.g., 5 years" style="width:110px;"></div>
|
|
<div class="demo-field"><label>Gender</label><select id="sick-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="sick-cc" placeholder="e.g., fever, ear pain, cough" style="width:100%;"></div>
|
|
<div class="demo-field demo-field-model"><label><i class="fas fa-robot"></i> Model</label><select id="sick-model-select" class="tab-model-select"></select></div>
|
|
<button id="btn-sick-infer" class="btn-sm btn-primary" style="align-self:flex-end;"><i class="fas fa-wand-magic-sparkles"></i> Update ROS/PE</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recording -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header">
|
|
<h3><i class="fas fa-microphone"></i> Encounter Recording / Dictation</h3>
|
|
<div style="display:flex;gap:6px;align-items:center;">
|
|
<button id="sick-record-btn" class="btn-sm btn-ghost"><i class="fas fa-microphone"></i> Listen In</button>
|
|
<button id="sick-pause-btn" class="btn-sm btn-ghost hidden"><i class="fas fa-pause"></i> Pause</button>
|
|
<div id="sick-rec-indicator" class="recording-indicator hidden" style="font-size:12px;"><div class="pulse-dot"></div><span>Recording... <span id="sick-timer">00:00</span></span></div>
|
|
</div>
|
|
</div>
|
|
<div style="padding:8px 16px;">
|
|
<div id="sick-transcript" class="editable-box" contenteditable="true" data-placeholder="Transcript appears here. Physician can dictate the HPI and encounter details."></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ROS (4 systems auto-inferred) -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header" style="display:flex;align-items:center;justify-content:space-between;">
|
|
<h3><i class="fas fa-list-check"></i> Review of Systems</h3>
|
|
<div style="display:flex;gap:6px;align-items:center;">
|
|
<button id="sick-ros-all-wnl" class="btn-sm btn-ghost" style="font-size:11px;"><i class="fas fa-check-double"></i> All WNL</button>
|
|
<select id="sick-ros-add" class="btn-sm" style="font-size:11px;padding:3px 6px;border:1px solid var(--g300);border-radius:6px;">
|
|
<option value="">+ Add system</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div id="sick-ros-container" style="padding:8px 16px;"></div>
|
|
</div>
|
|
|
|
<!-- PE (7 systems auto-inferred) -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header" style="display:flex;align-items:center;justify-content:space-between;">
|
|
<h3><i class="fas fa-stethoscope"></i> Physical Examination</h3>
|
|
<div style="display:flex;gap:6px;align-items:center;">
|
|
<button id="sick-pe-all-normal" class="btn-sm btn-ghost" style="font-size:11px;"><i class="fas fa-check-double"></i> All Normal</button>
|
|
<select id="sick-pe-add" class="btn-sm" style="font-size:11px;padding:3px 6px;border:1px solid var(--g300);border-radius:6px;">
|
|
<option value="">+ Add system</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div id="sick-pe-container" style="padding:8px 16px;"></div>
|
|
</div>
|
|
|
|
<!-- Diagnoses -->
|
|
<div class="card" style="margin-bottom:10px;">
|
|
<div class="card-header"><h3><i class="fas fa-tag"></i> Diagnoses (ICD-10)</h3></div>
|
|
<div id="sick-dx-container" style="padding:12px 16px;"></div>
|
|
</div>
|
|
|
|
<button id="btn-sick-generate" class="btn-generate"><i class="fas fa-wand-magic-sparkles"></i> Generate Sick Visit Note</button>
|
|
|
|
<!-- Output -->
|
|
<div id="sick-note-output" class="card output-card hidden">
|
|
<div class="card-header output-header">
|
|
<h3><i class="fas fa-file-medical"></i> Sick Visit Note</h3>
|
|
<div class="output-actions">
|
|
<span id="sick-note-model-tag" class="model-tag"></span>
|
|
<button class="btn-sm btn-ghost" id="btn-sick-new-patient"><i class="fas fa-rotate-left"></i> New Patient</button>
|
|
<button class="btn-sm btn-primary" data-action="copy" data-target="sick-note-text"><i class="fas fa-copy"></i> Copy</button>
|
|
<button class="btn-sm btn-ghost" data-action="speak" data-target="sick-note-text"><i class="fas fa-volume-high"></i> Read</button>
|
|
</div>
|
|
</div>
|
|
<div id="sick-note-text" class="output-text" contenteditable="true"></div>
|
|
<div class="refine-bar">
|
|
<input type="text" id="sick-refine-input" class="refine-input" placeholder="Tell AI to modify (e.g., 'add that patient received amoxicillin')">
|
|
<button class="btn-sm btn-primary" id="sick-refine-btn"><i class="fas fa-edit"></i> Refine</button>
|
|
<button class="btn-sm btn-ghost" id="sick-shorten-btn"><i class="fas fa-compress"></i> Shorter</button>
|
|
</div>
|
|
</div>
|
|
|