This commit is contained in:
2026-03-21 19:30:13 +08:00
parent 7520b7e2a0
commit 557e25d187
100 changed files with 16990 additions and 18914 deletions

View File

@@ -202,17 +202,19 @@
.form-group label { display: block; margin-bottom: 5px; font-weight: bold; color: #333; }
.form-group input, .form-group select { width: 100%; padding: 8px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; font-size:14px; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border-width: 0; }
</style>
</head>
<body bgcolor="#e6e6e6" text="#000000" link="#000080" vlink="#800080" alink="#FF0000">
<!-- Add Drug Modal -->
<div id="drug-modal" class="modal-overlay">
<div id="drug-modal" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="drug-modal-title">
<div class="modal-box">
<h3 style="margin-top:0; color:var(--primary); border-bottom:1px solid #eee; padding-bottom:10px;">New Order</h3>
<h3 id="drug-modal-title" style="margin-top:0; color:var(--primary); border-bottom:1px solid #eee; padding-bottom:10px;">New Order</h3>
<div class="form-group">
<label>Drug Name</label>
<select id="modal-drug-name" onchange="updateDrugSpecs()">
<label for="modal-drug-name">Drug Name</label>
<select id="modal-drug-name" onchange="updateDrugSpecs()" aria-label="Select drug name">
<option value="">-- Select --</option>
<option value="Aspirin">Aspirin Enteric-coated Tablets</option>
<option value="Atorvastatin">Atorvastatin Calcium Tablets</option>
@@ -225,14 +227,14 @@
</select>
</div>
<div class="form-group">
<label>Spec & Package</label>
<input type="text" id="modal-drug-spec" readonly style="background:#f5f5f5; color:#666;">
<label for="modal-drug-spec">Spec & Package</label>
<input type="text" id="modal-drug-spec" readonly style="background:#f5f5f5; color:#666;" aria-label="Drug specification">
</div>
<div class="form-group">
<label>Dosage</label>
<label for="modal-drug-dose">Dosage</label>
<div style="display:flex; gap:10px;">
<input type="text" id="modal-drug-dose" placeholder="Dose (e.g. 100mg)">
<select id="modal-drug-freq" style="width:140px;">
<input type="text" id="modal-drug-dose" placeholder="Dose (e.g. 100mg)" aria-label="Drug dosage">
<select id="modal-drug-freq" style="width:140px;" aria-label="Frequency">
<option value="qd">qd (once daily)</option>
<option value="bid">bid (twice daily)</option>
<option value="tid">tid (3 times daily)</option>
@@ -243,8 +245,8 @@
</div>
</div>
<div class="form-group">
<label>Route</label>
<select id="modal-drug-route">
<label for="modal-drug-route">Route</label>
<select id="modal-drug-route" aria-label="Administration route">
<option value="PO">PO (Oral)</option>
<option value="IV">IV (Intravenous)</option>
<option value="IH">IH (Hypodermic)</option>
@@ -252,49 +254,74 @@
</select>
</div>
<div style="text-align:right; margin-top:20px; padding-top:10px; border-top:1px solid #eee;">
<button type="button" onclick="closeModal()" style="padding:8px 15px; margin-right:10px; background:white; border:1px solid #ccc; border-radius:4px; cursor:pointer;">Cancel</button>
<button type="button" onclick="confirmAddDrug()" style="padding:8px 15px; background:var(--primary); color:white; border:none; border-radius:4px; cursor:pointer;">Confirm</button>
<button type="button" onclick="closeModal()" style="padding:8px 15px; margin-right:10px; background:white; border:1px solid #ccc; border-radius:4px; cursor:pointer;" aria-label="Cancel">Cancel</button>
<button type="button" onclick="confirmAddDrug()" style="padding:8px 15px; background:var(--primary); color:white; border:none; border-radius:4px; cursor:pointer;" aria-label="Confirm add drug">Confirm</button>
</div>
</div>
</div>
<!-- Confirmation Modal -->
<div id="confirm-modal" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="confirm-title">
<div class="modal-box" style="width:400px;">
<h3 id="confirm-title" style="margin-top:0; color:var(--primary); border-bottom:1px solid #eee; padding-bottom:10px;">Confirm Action</h3>
<div id="confirm-message" style="padding:15px 0; color:#333; line-height:1.6;"></div>
<div style="text-align:right; margin-top:20px; padding-top:10px; border-top:1px solid #eee;">
<button type="button" onclick="closeConfirmModal()" style="padding:8px 15px; margin-right:10px; background:white; border:1px solid #ccc; border-radius:4px; cursor:pointer;" aria-label="Cancel">Cancel</button>
<button type="button" id="confirm-btn" onclick="executeConfirm()" style="padding:8px 15px; background:var(--danger); color:white; border:none; border-radius:4px; cursor:pointer;" aria-label="Confirm">Confirm</button>
</div>
</div>
</div>
<!-- Input Modal -->
<div id="input-modal" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="input-title">
<div class="modal-box" style="width:400px;">
<h3 id="input-title" style="margin-top:0; color:var(--primary); border-bottom:1px solid #eee; padding-bottom:10px;">Enter Information</h3>
<div id="input-message" style="padding:10px 0; color:#333; font-size:13px;"></div>
<input type="text" id="input-field" style="width:100%; padding:8px; border:1px solid #ccc; border-radius:4px; margin:15px 0; box-sizing:border-box;" aria-label="Input field">
<div style="text-align:right; margin-top:20px; padding-top:10px; border-top:1px solid #eee;">
<button type="button" onclick="closeInputModal()" style="padding:8px 15px; margin-right:10px; background:white; border:1px solid #ccc; border-radius:4px; cursor:pointer;" aria-label="Cancel">Cancel</button>
<button type="button" id="input-btn" onclick="executeInput()" style="padding:8px 15px; background:var(--primary); color:white; border:none; border-radius:4px; cursor:pointer;" aria-label="Submit">Submit</button>
</div>
</div>
</div>
<div id="toast-container"></div>
<table width="100%" border="1" bgcolor="#ffcccc" cellpadding="5">
<table width="100%" border="1" bgcolor="#ffcccc" cellpadding="5" role="region" aria-label="System broadcast">
<tr>
<td align="center">
<font color="red"><b>Broadcast:</b> Attention all departments, emergency meeting on insurance cost control at 3 PM in the Admin Building.</font>
<span style="color:red;"><strong>Broadcast:</strong> Attention all departments, emergency meeting on insurance cost control at 3 PM in the Admin Building.</span>
<br>
<font size="2">Posted: 2025-12-22 08:30</font>
<span style="font-size:12px;">Posted: 2025-12-22 08:30</span>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" bgcolor="#008080" cellpadding="10">
<table width="100%" border="0" bgcolor="#008080" cellpadding="10" role="banner">
<tr>
<td width="50%">
<font color="white" size="5"><b>City General Hospital - Doctor Station</b></font>
<h1 style="color:white; font-size:20px; margin:0;"><strong>City General Hospital - Doctor Station</strong></h1>
</td>
<td width="50%" align="right">
<font color="white">
User: <b>Dr. Li (Attending)</b> | Dept: Cardiology<br>
<a href="javascript:void(0)" onclick="modifyPassword()" style="color:yellow">[Change Pwd]</a>
<a href="javascript:void(0)" onclick="logout()" style="color:white">[Logout]</a>
</font>
<span style="color:white;">
User: <strong>Dr. Li (Attending)</strong> | Dept: Cardiology<br>
<button onclick="modifyPassword()" style="background:none; border:none; color:yellow; cursor:pointer; text-decoration:underline;" aria-label="Change password">[Change Pwd]</button>
<button onclick="logout()" style="background:none; border:none; color:white; cursor:pointer; text-decoration:underline;" aria-label="Logout">[Logout]</button>
</span>
</td>
</tr>
</table>
<table width="100%" border="1" cellpadding="0" cellspacing="0" bgcolor="#343a40">
<table width="100%" border="1" cellpadding="0" cellspacing="0" bgcolor="#343a40" role="navigation" aria-label="Module navigation">
<tr>
<td style="display:flex; padding:0;">
<div class="nav-item active" onclick="switchModule(this, 'clinic')">Outpatient</div>
<div class="nav-item" onclick="switchModule(this, 'inpatient')">Inpatient</div>
<div class="nav-item" onclick="switchModule(this, 'surgery')">Surgery</div>
<div class="nav-item" onclick="switchModule(this, 'lab')">Lab Results</div>
<div class="nav-item" onclick="switchModule(this, 'pharmacy')">Pharmacy</div>
<div class="nav-item" onclick="switchModule(this, 'admin')">Order Admin</div>
<button class="nav-item active" onclick="switchModule(this, 'clinic')" role="menuitem" aria-current="page" aria-label="Outpatient module">Outpatient</button>
<button class="nav-item" onclick="switchModule(this, 'inpatient')" role="menuitem" aria-label="Inpatient module">Inpatient</button>
<button class="nav-item" onclick="switchModule(this, 'surgery')" role="menuitem" aria-label="Surgery module">Surgery</button>
<button class="nav-item" onclick="switchModule(this, 'lab')" role="menuitem" aria-label="Lab results module">Lab Results</button>
<button class="nav-item" onclick="switchModule(this, 'pharmacy')" role="menuitem" aria-label="Pharmacy module">Pharmacy</button>
<button class="nav-item" onclick="switchModule(this, 'admin')" role="menuitem" aria-label="Order admin module">Order Admin</button>
</td>
</tr>
</table>
@@ -590,6 +617,63 @@
}, 3000);
}
// -------------------------------------------------------------------------
// Custom Modal Functions
// -------------------------------------------------------------------------
let confirmCallback = null;
let inputCallback = null;
function showConfirm(message, callback) {
confirmCallback = callback;
document.getElementById('confirm-message').innerText = message;
document.getElementById('confirm-modal').classList.add('show');
}
function closeConfirmModal() {
document.getElementById('confirm-modal').classList.remove('show');
confirmCallback = null;
}
function executeConfirm() {
if(confirmCallback) {
confirmCallback();
}
closeConfirmModal();
}
function showInput(message, callback) {
inputCallback = callback;
document.getElementById('input-message').innerText = message;
document.getElementById('input-field').value = '';
document.getElementById('input-modal').classList.add('show');
document.getElementById('input-field').focus();
}
function closeInputModal() {
document.getElementById('input-modal').classList.remove('show');
inputCallback = null;
}
function executeInput() {
const value = document.getElementById('input-field').value;
if(inputCallback) {
inputCallback(value);
}
closeInputModal();
}
// Allow Enter key to submit input modal
document.addEventListener('DOMContentLoaded', () => {
const inputField = document.getElementById('input-field');
if(inputField) {
inputField.addEventListener('keypress', (e) => {
if(e.key === 'Enter' && document.getElementById('input-modal').classList.contains('show')) {
executeInput();
}
});
}
});
function switchModule(el, moduleName) {
// Toggle active state in Nav
document.querySelectorAll('.nav-item').forEach(item => item.classList.remove('active'));
@@ -615,10 +699,10 @@
}
function logout() {
if(confirm("Are you sure you want to logout Current User (Dr. Zhang)?")) {
showConfirm("Are you sure you want to logout Current User (Dr. Zhang)?", () => {
showToast("Logging out...", "info");
setTimeout(() => location.reload(), 1000);
}
});
}
function openOA() { showToast("Opening OA System..."); }
@@ -855,11 +939,12 @@
}
function removeOrder(orderId) {
if(!confirm("Are you sure you want to delete this order?")) return;
const p = PATIENTS.find(x => x.id === currentPatientId);
p.orders = p.orders.filter(o => o.id !== orderId);
renderOrders();
showToast("Order Deleted");
showConfirm("Are you sure you want to delete this order?", () => {
const p = PATIENTS.find(x => x.id === currentPatientId);
p.orders = p.orders.filter(o => o.id !== orderId);
renderOrders();
showToast("Order Deleted");
});
}
function signOrder() {
@@ -871,12 +956,13 @@
return;
}
const pin = prompt(`Signing ${drafts.length} orders for patient [${p.name}].\n\nPlease enter E-Signature PIN (any input):`);
if(pin) {
drafts.forEach(o => o.status = 'signed');
showToast("Orders Signed & Sent to Pharmacy.", "success");
renderOrders();
}
showInput(`Signing ${drafts.length} orders for patient [${p.name}].\n\nPlease enter E-Signature PIN:`, (pin) => {
if(pin) {
drafts.forEach(o => o.status = 'signed');
showToast("Orders Signed & Sent to Pharmacy.", "success");
renderOrders();
}
});
}
function voidOrder() {
@@ -903,24 +989,25 @@
}
function restockDrug(drugName) {
if(confirm(`Send restock request for [${drugName}]?`)) {
showConfirm(`Send restock request for [${drugName}]?`, () => {
showToast("Restock request sent to Supply Chain", "success");
}
});
}
function batchApproveOrders() {
if(confirm("Batch approve these 3 orders?")) {
showConfirm("Batch approve these 3 orders?", () => {
showToast("Batch Approval Complete", "success");
document.getElementById('admin-task-area').innerHTML = '<p style="color:green;">All pending tasks completed.</p>';
}
});
}
function batchRejectOrders() {
const reason = prompt("Enter Rejection Reason:");
if(reason) {
showToast(`3 Orders Rejected. Reason: ${reason}`, "info");
document.getElementById('admin-task-area').innerHTML = '<p style="color:green;">All pending tasks completed.</p>';
}
showInput("Enter Rejection Reason:", (reason) => {
if(reason) {
showToast(`3 Orders Rejected. Reason: ${reason}`, "info");
document.getElementById('admin-task-area').innerHTML = '<p style="color:green;">All pending tasks completed.</p>';
}
});
}
console.log("HIS System Loaded. Interface modernized.");