refactor(ui): enhance dashboard layout with improved sidebar structure, update search bar styles, and implement responsive table scrolling
Build Curio HMS / build-and-deploy (push) Successful in 51s
Details
Build Curio HMS / build-and-deploy (push) Successful in 51s
Details
This commit is contained in:
parent
a10d1e7cad
commit
5f2862c8a2
427
dashboard.css
427
dashboard.css
|
|
@ -21,6 +21,31 @@
|
|||
border-right: 1px solid rgba(255, 255, 255, 0.05);
|
||||
box-shadow: 10px 0 30px rgba(0, 0, 0, 0.2);
|
||||
z-index: 100;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sidebar-footer {
|
||||
margin-top: auto;
|
||||
padding-top: 1.5rem;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.sidebar-footer .user-profile {
|
||||
margin-top: 0;
|
||||
padding-top: 0;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.sidebar-footer .logout-btn {
|
||||
margin-top: 0.75rem;
|
||||
padding: 0.75rem 1rem;
|
||||
}
|
||||
|
||||
.build-tag {
|
||||
font-size: 0.65rem;
|
||||
color: #94a3b8;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
.dashboard-main {
|
||||
|
|
@ -30,86 +55,6 @@
|
|||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.dash-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 2.5rem;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.search-bar {
|
||||
flex: 1;
|
||||
max-width: 600px;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 1.25rem;
|
||||
color: var(--text-muted);
|
||||
font-size: 1.1rem;
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.search-bar input {
|
||||
width: 100%;
|
||||
padding: 1rem 1.5rem 1rem 3rem;
|
||||
border-radius: 16px;
|
||||
border: 1px solid var(--border);
|
||||
background: var(--surface);
|
||||
font-size: 0.95rem;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.02);
|
||||
}
|
||||
|
||||
.search-bar input:focus {
|
||||
outline: none;
|
||||
border-color: var(--secondary);
|
||||
background: white;
|
||||
box-shadow: 0 10px 25px rgba(37, 99, 235, 0.1);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1.25rem;
|
||||
}
|
||||
|
||||
.date-picker-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
background: var(--surface);
|
||||
padding: 0.65rem 1.25rem;
|
||||
border-radius: 14px;
|
||||
border: 1px solid var(--border);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.02);
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.date-picker-group:hover {
|
||||
border-color: var(--secondary);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.calendar-icon {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.date-input {
|
||||
border: none;
|
||||
font-family: 'Inter', sans-serif;
|
||||
font-weight: 600;
|
||||
color: var(--text-main);
|
||||
outline: none;
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
}
|
||||
.logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
@ -145,6 +90,9 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.side-nav a {
|
||||
|
|
@ -166,9 +114,6 @@
|
|||
}
|
||||
|
||||
.user-profile {
|
||||
margin-top: auto;
|
||||
padding-top: 2rem;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
|
|
@ -223,12 +168,7 @@
|
|||
color: #FCA5A5;
|
||||
}
|
||||
|
||||
.sidebar > .logout-btn {
|
||||
margin-top: auto;
|
||||
padding: 0.75rem 1rem;
|
||||
}
|
||||
|
||||
.sidebar > .logout-btn:hover {
|
||||
.sidebar-footer .logout-btn:hover {
|
||||
background: rgba(239, 68, 68, 0.12);
|
||||
}
|
||||
|
||||
|
|
@ -281,6 +221,8 @@
|
|||
|
||||
.action-center {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
|
|
@ -417,8 +359,8 @@
|
|||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
gap: 1.5rem;
|
||||
align-items: center;
|
||||
gap: 1.25rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
|
|
@ -446,18 +388,32 @@
|
|||
.search-bar {
|
||||
flex: 1;
|
||||
min-width: 220px;
|
||||
max-width: 480px;
|
||||
max-width: 520px;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 1rem;
|
||||
color: var(--text-muted);
|
||||
font-size: 1rem;
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.search-bar input {
|
||||
width: 100%;
|
||||
padding: 0.875rem 1.25rem;
|
||||
padding: 0.875rem 1.25rem 0.875rem 2.75rem;
|
||||
border-radius: var(--radius-md);
|
||||
border: 1px solid var(--border);
|
||||
background: var(--surface);
|
||||
font-size: 0.95rem;
|
||||
color: var(--text-main);
|
||||
transition: var(--transition);
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
|
||||
.search-bar input::placeholder {
|
||||
|
|
@ -476,6 +432,15 @@
|
|||
gap: 0.5rem;
|
||||
font-size: 0.875rem;
|
||||
color: var(--text-muted);
|
||||
background: var(--surface);
|
||||
padding: 0.5rem 0.85rem;
|
||||
border-radius: var(--radius-md);
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.calendar-icon {
|
||||
font-size: 1rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.date-input {
|
||||
|
|
@ -567,6 +532,17 @@
|
|||
gap: 1rem;
|
||||
}
|
||||
|
||||
.table-scroll {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
border-radius: var(--radius-md);
|
||||
}
|
||||
|
||||
.table-scroll .queue-table {
|
||||
min-width: 720px;
|
||||
}
|
||||
|
||||
.queue-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
|
|
@ -814,9 +790,11 @@
|
|||
background: var(--bg);
|
||||
}
|
||||
|
||||
.pipeline-item.next {
|
||||
.pipeline-item.next,
|
||||
.pipeline-item.active {
|
||||
border-color: var(--secondary);
|
||||
background: rgba(37, 99, 235, 0.05);
|
||||
background: rgba(37, 99, 235, 0.06);
|
||||
box-shadow: inset 3px 0 0 var(--secondary);
|
||||
}
|
||||
|
||||
.p-token {
|
||||
|
|
@ -1317,21 +1295,24 @@
|
|||
/* --- WORLD-CLASS ZEN 4.0 ADD-ONS --- */
|
||||
.patient-banner-inner {
|
||||
background: white;
|
||||
padding: 0.75rem 1.25rem;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.02);
|
||||
padding: 1rem 1.25rem;
|
||||
border-radius: var(--radius-md);
|
||||
box-shadow: var(--shadow-sm);
|
||||
border: 1px solid var(--border);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 0.25rem;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.75rem 1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.patient-identity-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
|
@ -1351,11 +1332,23 @@
|
|||
|
||||
.zen-layout-3col {
|
||||
display: grid;
|
||||
grid-template-columns: 180px minmax(400px, 2.5fr) minmax(280px, 1.2fr);
|
||||
gap: 1.5rem;
|
||||
align-items: start;
|
||||
padding: 1rem;
|
||||
height: calc(100vh - 120px); /* Fill screen height perfectly without overflow strings */
|
||||
grid-template-columns: minmax(160px, 200px) minmax(0, 2.5fr) minmax(240px, 320px);
|
||||
gap: 1.25rem;
|
||||
align-items: stretch;
|
||||
padding: 0;
|
||||
min-height: calc(100vh - 8rem);
|
||||
}
|
||||
|
||||
.zen-sidebar-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.zen-sidebar-right .insight-card,
|
||||
.zen-sidebar-right .ai-nudge-box {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.zen-layout-3col.collapsed-queue {
|
||||
|
|
@ -1399,19 +1392,22 @@
|
|||
.zen-workspace-soap {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.5rem;
|
||||
gap: 1rem;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.soap-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.25rem;
|
||||
overflow-y: auto; /* Allow independent scrolling for documentation */
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
background: white;
|
||||
border-radius: 30px;
|
||||
padding: 2.5rem;
|
||||
box-shadow: 0 10px 40px rgba(0,0,0,0.02);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: 1.5rem;
|
||||
box-shadow: var(--shadow-sm);
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
|
|
@ -1442,13 +1438,17 @@
|
|||
font-size: 0.95rem;
|
||||
line-height: 1.5;
|
||||
padding: 0.75rem;
|
||||
border: 1px solid #cbd5e1;
|
||||
border-radius: 6px;
|
||||
transition: border-color 0.2s ease;
|
||||
background: #F8FAFC;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-sm);
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
background: var(--bg);
|
||||
color: var(--text-main);
|
||||
}
|
||||
|
||||
.zen-textarea-small::placeholder {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.zen-textarea-small:focus {
|
||||
border-color: #3b82f6;
|
||||
outline: none;
|
||||
|
|
@ -1499,6 +1499,91 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* Lab watcher & shared form utilities */
|
||||
.insights-box {
|
||||
margin-top: 1rem;
|
||||
color: var(--text-muted);
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.insights-box p {
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.lab-watcher-card {
|
||||
margin-top: 1.25rem;
|
||||
}
|
||||
|
||||
.lab-watcher-form {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
align-items: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
flex: 1 1 200px;
|
||||
min-width: 0;
|
||||
padding: 0.75rem 1rem;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md);
|
||||
background: var(--bg);
|
||||
color: var(--text-main);
|
||||
font-family: inherit;
|
||||
font-size: 0.95rem;
|
||||
transition: var(--transition);
|
||||
}
|
||||
|
||||
.form-input:focus {
|
||||
outline: none;
|
||||
border-color: var(--secondary);
|
||||
background: var(--surface);
|
||||
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
||||
}
|
||||
|
||||
.lab-result-section {
|
||||
margin-top: 1.25rem;
|
||||
padding-top: 1.25rem;
|
||||
border-top: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.lab-result-input {
|
||||
flex: 1 1 280px;
|
||||
}
|
||||
|
||||
.lab-alerts-container {
|
||||
margin-top: 1.25rem;
|
||||
}
|
||||
|
||||
.lab-alert-card {
|
||||
background: #fee2e2;
|
||||
border-left: 4px solid var(--urgent);
|
||||
padding: 0.75rem 1rem;
|
||||
margin-bottom: 0.75rem;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
|
||||
.lab-alert-card strong {
|
||||
color: #991b1b;
|
||||
}
|
||||
|
||||
.lab-alert-card p {
|
||||
margin: 0.35rem 0 0;
|
||||
color: #7f1d1d;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
#labWatcherStatusBadge.badge-active {
|
||||
background: rgba(16, 185, 129, 0.12);
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.section-container {
|
||||
animation: fadeIn 0.35s ease-out forwards;
|
||||
}
|
||||
|
||||
/* Mobile sidebar */
|
||||
.sidebar-mobile-toggle {
|
||||
display: none;
|
||||
|
|
@ -1517,15 +1602,61 @@
|
|||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.sidebar-backdrop {
|
||||
display: none;
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(15, 23, 42, 0.45);
|
||||
z-index: 1040;
|
||||
}
|
||||
|
||||
.sidebar-backdrop.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.queue-section {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.zen-layout-3col {
|
||||
grid-template-columns: minmax(140px, 180px) minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.zen-sidebar-right {
|
||||
grid-column: 1 / -1;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.zen-sidebar-right .insight-card,
|
||||
.zen-sidebar-right .ai-nudge-box {
|
||||
flex: 1 1 280px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.queue-section,
|
||||
.dashboard-main {
|
||||
padding: 2rem 1.5rem;
|
||||
}
|
||||
|
||||
.zen-layout,
|
||||
.zen-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.revenue-grid {
|
||||
grid-template-columns: 1fr;
|
||||
@media (min-width: 769px) {
|
||||
.sidebar-mobile-toggle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
transform: translateX(0) !important;
|
||||
}
|
||||
|
||||
.sidebar-backdrop {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1544,29 +1675,79 @@
|
|||
transform: translateX(0);
|
||||
}
|
||||
|
||||
.sidebar.compact-rail {
|
||||
width: var(--sidebar-width);
|
||||
padding: 2.5rem 1.5rem;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.sidebar.compact-rail .logo-text,
|
||||
.sidebar.compact-rail .user-profile .info,
|
||||
.sidebar.compact-rail .nav-text {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
.sidebar.compact-rail .side-nav a {
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: 0.75rem 1rem;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.sidebar.compact-rail + .dashboard-main,
|
||||
.dashboard-main {
|
||||
margin-left: 0;
|
||||
padding: 1.25rem;
|
||||
padding-top: 4rem;
|
||||
padding-top: 4.5rem;
|
||||
}
|
||||
|
||||
.dash-header {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header-actions .btn-primary {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.search-bar {
|
||||
max-width: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.zen-layout-3col {
|
||||
grid-template-columns: 1fr !important;
|
||||
height: auto;
|
||||
min-height: auto;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
|
||||
.zen-sidebar-right {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.zen-pipeline.full-height {
|
||||
height: auto;
|
||||
max-height: none;
|
||||
position: static;
|
||||
}
|
||||
|
||||
.patient-identity-row {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.patient-identity-row .allergy-tag {
|
||||
align-self: stretch;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.soap-container {
|
||||
padding: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Utility Hidden */
|
||||
|
|
|
|||
|
|
@ -4,16 +4,17 @@
|
|||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Dashboard | Curio</title>
|
||||
<link rel="stylesheet" href="globals.css?v=26">
|
||||
<link rel="stylesheet" href="index.css?v=26">
|
||||
<link rel="stylesheet" href="dashboard.css?v=99">
|
||||
<link rel="stylesheet" href="globals.css?v=27">
|
||||
<link rel="stylesheet" href="dashboard.css?v=100">
|
||||
<link rel="stylesheet" href="settings.css?v=27">
|
||||
<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@400;500;600;700&family=Outfit:wght@500;600;700&display=swap" rel="stylesheet">
|
||||
<script src="tenantLoader.js?v=26"></script>
|
||||
</head>
|
||||
<body class="dashboard-body">
|
||||
<div class="sidebar-mobile-toggle" onclick="toggleSidebar()">☰ Menu</div>
|
||||
<div class="sidebar-backdrop" id="sidebarBackdrop" onclick="toggleSidebar()" aria-hidden="true"></div>
|
||||
<button type="button" class="sidebar-mobile-toggle" onclick="toggleSidebar()" aria-label="Open navigation menu" aria-expanded="false" id="sidebarMenuBtn">☰ Menu</button>
|
||||
<aside class="sidebar" id="sidebar">
|
||||
<div class="logo">
|
||||
<span class="logo-icon">C</span>
|
||||
|
|
@ -29,22 +30,24 @@
|
|||
<a href="staff.html" data-section="staff" data-external><span>👤</span> <span class="nav-text">Staff & Payroll</span></a>
|
||||
<a href="#" data-section="settings"><span>⚙️ </span> <span class="nav-text">Settings</span></a>
|
||||
</nav>
|
||||
<div class="user-profile">
|
||||
<div class="avatar">DS</div>
|
||||
<div class="info">
|
||||
<strong>Dr. Sharma</strong>
|
||||
<span>Cardiologist</span>
|
||||
<div style="font-size: 0.65rem; color: #94a3b8; margin-top: 0.25rem;">Build: 1.4.0-ZEN</div>
|
||||
<div class="sidebar-footer">
|
||||
<div class="user-profile">
|
||||
<div class="avatar">DS</div>
|
||||
<div class="info">
|
||||
<strong>Dr. Sharma</strong>
|
||||
<span>Cardiologist</span>
|
||||
<div class="build-tag">Build: 1.4.0-ZEN</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="login.html" class="logout-btn"><span>🚪</span> <span class="nav-text">Logout</span></a>
|
||||
</div>
|
||||
<a href="login.html" class="logout-btn"><span>🚪</span> <span class="nav-text">Logout</span></a>
|
||||
<textarea id="consultationNotes" style="position: absolute; width: 1px; height: 1px; opacity: 0.01; pointer-events: none;"></textarea>
|
||||
</aside>
|
||||
|
||||
<main class="dashboard-main">
|
||||
<header class="dash-header">
|
||||
<div class="search-bar">
|
||||
<span class="search-icon">🔍</span>
|
||||
<span class="search-icon" aria-hidden="true">🔍</span>
|
||||
<input type="text" id="patientSearch" placeholder="Search patients by name or WhatsApp number..." aria-label="Search patients">
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
|
|
@ -228,7 +231,7 @@
|
|||
<div class="stat-card">
|
||||
<span>In Queue</span>
|
||||
<h3>12 Patients</h3>
|
||||
<small class="text-accent">↑ 4 since last hour</small>
|
||||
<small class="text-accent">↑ 4 since last hour</small>
|
||||
</div>
|
||||
<div class="stat-card quota-card">
|
||||
<span>Current Slot (10:00-10:30)</span>
|
||||
|
|
@ -260,6 +263,7 @@
|
|||
<span class="badge muted">Walk-ins</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-scroll">
|
||||
<table class="queue-table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -306,6 +310,7 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="side-panel">
|
||||
|
|
@ -327,6 +332,7 @@
|
|||
<h2>Patient Records</h2>
|
||||
<button class="btn-primary">+ Add New Patient</button>
|
||||
</div>
|
||||
<div class="table-scroll">
|
||||
<table class="queue-table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -349,6 +355,7 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
|
|
@ -365,6 +372,7 @@
|
|||
<div class="stat-card"><span>Total Inventory Value</span><h3>₹4,25,000</h3></div>
|
||||
<div class="stat-card"><span>Daily Sales (GST)</span><h3>₹12,450</h3></div>
|
||||
</div>
|
||||
<div class="table-scroll">
|
||||
<table class="queue-table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -382,6 +390,7 @@
|
|||
<tr><td>M03</td><td><strong>Cough Syrup</strong></td><td>S881</td><td><span class="text-accent">Apr 2026</span></td><td>4</td><td>₹85</td><td><button class="btn-small secondary">Restock</button></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
|
|
@ -391,6 +400,7 @@
|
|||
<h2>🔬 Laboratory Orders</h2>
|
||||
<span class="badge">4 New Orders</span>
|
||||
</div>
|
||||
<div class="table-scroll">
|
||||
<table class="queue-table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -406,32 +416,32 @@
|
|||
<tr><td>LAB-101</td><td><strong>Rahul Verma</strong></td><td>CBC (Complete Blood Count)</td><td><span class="triage-pill urgent">High</span></td><td><span class="status-pill waiting">Sample Awaited</span></td><td><button class="btn-small">Collect Sample</button></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- AI Lab Watcher Widget -->
|
||||
<section class="section-card" style="margin-top: 20px;">
|
||||
<section class="section-card lab-watcher-card">
|
||||
<div class="card-header">
|
||||
<h2>🤖 AI Lab Anomaly Watcher</h2>
|
||||
<span id="labWatcherStatusBadge" class="badge">Offline</span>
|
||||
</div>
|
||||
<div class="insights-box" style="margin-top: 15px;">
|
||||
<div class="insights-box">
|
||||
<p>The AI Watcher runs continuously in the background using Temporal to monitor patient lab results for dangerous drug interactions or baseline anomalies.</p>
|
||||
|
||||
<div style="margin-top: 15px;">
|
||||
<input type="text" id="labPatientId" placeholder="Patient ID (e.g. PAT-123)" class="form-input" style="width: 200px; display: inline-block;">
|
||||
<input type="text" id="labBaseline" placeholder="Mock Baseline (e.g. Patient is on Warfarin)" class="form-input" style="width: 300px; display: inline-block; margin-left: 10px;">
|
||||
<button id="startWatcherBtn" class="btn-primary" style="margin-left: 10px;">Start Watcher</button>
|
||||
<div class="lab-watcher-form">
|
||||
<input type="text" id="labPatientId" placeholder="Patient ID (e.g. PAT-123)" class="form-input">
|
||||
<input type="text" id="labBaseline" placeholder="Mock Baseline (e.g. Patient is on Warfarin)" class="form-input">
|
||||
<button type="button" id="startWatcherBtn" class="btn-primary">Start Watcher</button>
|
||||
</div>
|
||||
|
||||
<div id="labResultInputSection" class="hidden" style="margin-top: 20px; border-top: 1px solid #ddd; padding-top: 15px;">
|
||||
<div id="labResultInputSection" class="lab-result-section hidden">
|
||||
<p><strong>Submit New Lab Result</strong></p>
|
||||
<input type="text" id="newLabResult" placeholder="e.g. High INR 6.5" class="form-input" style="width: 400px; display: inline-block;">
|
||||
<button id="submitLabBtn" class="btn-primary" style="margin-left: 10px;">Send to AI Watcher</button>
|
||||
<div class="lab-watcher-form">
|
||||
<input type="text" id="newLabResult" placeholder="e.g. High INR 6.5" class="form-input lab-result-input">
|
||||
<button type="button" id="submitLabBtn" class="btn-primary">Send to AI Watcher</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="aiAlertsContainer" style="margin-top: 20px;">
|
||||
<!-- AI Alerts will be dynamically rendered here -->
|
||||
</div>
|
||||
<div id="aiAlertsContainer" class="lab-alerts-container"></div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
|
@ -451,7 +461,7 @@
|
|||
<span aria-hidden="true">🎙️</span> Record consultation
|
||||
</button>
|
||||
<div id="recordingStatus" class="rx-recording-status hidden">
|
||||
<span class="pulse"></span> Recording in progress…
|
||||
<span class="pulse"></span> Recording in progress…
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -515,12 +525,12 @@
|
|||
<button type="button" class="rx-tip-btn" onclick="shareTip('diabetes')">🥗 Diabetes diet</button>
|
||||
<button type="button" class="rx-tip-btn" onclick="shareTip('hypertension')">🧘 BP control</button>
|
||||
<button type="button" class="rx-tip-btn" onclick="shareTip('viral')">💧 Hydration</button>
|
||||
<button type="button" class="rx-tip-btn" onclick="printTips()">🖨️ Print tips</button>
|
||||
<button type="button" class="rx-tip-btn" onclick="printTips()">🖨️ Print tips</button>
|
||||
</div>
|
||||
</section>
|
||||
<section class="rx-sidebar-block">
|
||||
<label class="rx-label" for="deptNote">Note to departments</label>
|
||||
<textarea id="deptNote" class="rx-textarea" placeholder="Instructions for pharmacy or lab…" rows="3"></textarea>
|
||||
<textarea id="deptNote" class="rx-textarea" placeholder="Instructions for pharmacy or lab…" rows="3"></textarea>
|
||||
</section>
|
||||
</aside>
|
||||
</div>
|
||||
|
|
@ -533,7 +543,7 @@
|
|||
</div>
|
||||
|
||||
</main>
|
||||
<script src="dashboard.js?v=99"></script>
|
||||
<script src="dashboard.js?v=100"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
|||
30
dashboard.js
30
dashboard.js
|
|
@ -289,7 +289,10 @@ window.showSection = (sectionId) => {
|
|||
setActiveNavLink(sectionId);
|
||||
|
||||
if (window.innerWidth <= 768) {
|
||||
document.getElementById('sidebar')?.classList.remove('open');
|
||||
const sidebar = document.getElementById('sidebar');
|
||||
sidebar?.classList.remove('open');
|
||||
document.getElementById('sidebarBackdrop')?.classList.remove('visible');
|
||||
document.getElementById('sidebarMenuBtn')?.setAttribute('aria-expanded', 'false');
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -456,11 +459,17 @@ window.switchPatientContext = (name, token, triage) => {
|
|||
if (patientHeading) {
|
||||
patientHeading.innerHTML = `${name} <small>(28y, M)</small>`;
|
||||
}
|
||||
|
||||
document.querySelectorAll('.pipeline-item').forEach(item => {
|
||||
const itemToken = item.querySelector('.p-token')?.textContent?.trim();
|
||||
item.classList.toggle('next', itemToken === token);
|
||||
item.classList.toggle('active', itemToken === token);
|
||||
});
|
||||
};
|
||||
|
||||
// 5. Global Helpers & Modal Handlers
|
||||
window.openHistory = () => {
|
||||
const heading = document.querySelector(".patient-identity h1");
|
||||
const heading = document.querySelector(".patient-identity-row h1, .patient-identity h1");
|
||||
const name = heading ? heading.innerText.split(' (')[0] : 'Patient';
|
||||
alert(`📂 Loading History for ${name}...\n\n- Visit (05/12/26): Chronic Gastritis`);
|
||||
};
|
||||
|
|
@ -476,7 +485,12 @@ window.openConsultation = () => {
|
|||
window.shareSummary = () => alert("📤 Summary sent to Patient's WhatsApp.");
|
||||
window.printSummary = () => alert("🖨️ Printing Handover Note...");
|
||||
window.toggleSidebar = () => {
|
||||
document.getElementById('sidebar')?.classList.toggle('open');
|
||||
const sidebar = document.getElementById('sidebar');
|
||||
const backdrop = document.getElementById('sidebarBackdrop');
|
||||
const menuBtn = document.getElementById('sidebarMenuBtn');
|
||||
const isOpen = sidebar?.classList.toggle('open');
|
||||
backdrop?.classList.toggle('visible', !!isOpen);
|
||||
if (menuBtn) menuBtn.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
|
||||
};
|
||||
|
||||
function closeRxModal() {
|
||||
|
|
@ -644,7 +658,7 @@ if (startWatcherBtn) {
|
|||
if (data.success) {
|
||||
activeWatcherPatientId = patientId;
|
||||
labWatcherStatusBadge.innerText = "Active (Monitoring)";
|
||||
labWatcherStatusBadge.style.backgroundColor = "var(--success-color)";
|
||||
labWatcherStatusBadge.classList.add('badge-active');
|
||||
|
||||
labResultInputSection.classList.remove("hidden");
|
||||
startWatcherBtn.innerText = "Watcher Running";
|
||||
|
|
@ -729,10 +743,10 @@ function renderAlerts(alerts) {
|
|||
alerts.forEach((alert, index) => {
|
||||
if (alert.is_dangerous) {
|
||||
html += `
|
||||
<div style="background-color: #fee2e2; border-left: 4px solid #ef4444; padding: 10px; margin-bottom: 10px; border-radius: 4px;">
|
||||
<strong style="color: #991b1b;">Alert #${index + 1}</strong>
|
||||
<p style="margin: 5px 0; color: #7f1d1d;">${alert.danger_explanation}</p>
|
||||
<p style="margin: 0; font-size: 0.9em; color: #991b1b;"><strong>Action:</strong> ${alert.recommended_action}</p>
|
||||
<div class="lab-alert-card">
|
||||
<strong>Alert #${index + 1}</strong>
|
||||
<p>${alert.danger_explanation}</p>
|
||||
<p><strong>Action:</strong> ${alert.recommended_action}</p>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
--secondary-hover: #1D4ED8;
|
||||
--accent: #059669; /* Darker green for accessibility */
|
||||
--accent-hover: #047857;
|
||||
--success-color: #059669;
|
||||
--urgent: #EF4444;
|
||||
--warning: #F59E0B;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue