{"ast":null,"code":"var _jsxFileName = \"C:\\\\Users\\\\User\\\\Downloads\\\\medora5\\\\frontend\\\\src\\\\pages\\\\Dashboard.js\",\n _s = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { patientService } from '../services/patientService';\nimport { doctorService } from '../services/doctorService';\nimport { appointmentService } from '../services/appointmentService';\nimport { labService } from '../services/labService';\nimport { billingService } from '../services/billingService';\nimport Loading from '../components/Loading';\nimport { jsxDEV as _jsxDEV, Fragment as _Fragment } from \"react/jsx-dev-runtime\";\nfunction Dashboard() {\n _s();\n const [stats, setStats] = useState({\n patients: 0,\n doctors: 0,\n appointments: 0\n });\n const [userAppointments, setUserAppointments] = useState([]);\n const [doctorInfo, setDoctorInfo] = useState(null);\n const [pendingLabTests, setPendingLabTests] = useState([]);\n const [billings, setBillings] = useState([]);\n const [patientBillings, setPatientBillings] = useState([]);\n const [loading, setLoading] = useState(true);\n const user = JSON.parse(localStorage.getItem('user') || '{}');\n const isPatient = user.role === 'PATIENT';\n const isDoctor = user.role === 'DOCTOR';\n const isLabTechnician = user.role === 'LAB_TECHNICIAN';\n const isBillingAdmin = user.role === 'BILLING_ADMIN';\n useEffect(() => {\n const fetchStats = async () => {\n try {\n if (isPatient) {\n // For patients, fetch their own appointments, medical records, and billing\n const [appointmentsRes, billingRes] = await Promise.all([appointmentService.getAppointmentsForPatient(user.patientId), billingService.getBillingHistoryForPatient(user.patientId)]);\n setUserAppointments(appointmentsRes.data || []);\n setPatientBillings(billingRes.data || []);\n } else if (isDoctor) {\n // For doctors, fetch their own appointments and full doctor information\n const [appointmentsRes, doctorRes] = await Promise.all([appointmentService.getAppointmentsForDoctor(user.doctorId), doctorService.getDoctorById(user.doctorId)]);\n setUserAppointments(appointmentsRes.data || []);\n setDoctorInfo(doctorRes.data);\n } else if (isLabTechnician) {\n // For lab technicians, fetch pending lab tests\n const pendingRes = await labService.getPendingLabTests();\n setPendingLabTests(pendingRes.data || []);\n } else if (isBillingAdmin) {\n // For billing admins, fetch all billing records\n const billingsRes = await billingService.getAllBillings();\n setBillings(billingsRes.data || []);\n } else {\n // For admin/staff, fetch all stats\n const [patientsRes, doctorsRes, appointmentsRes] = await Promise.all([patientService.getAllPatients(), doctorService.getAllDoctors(), appointmentService.getAllAppointments()]);\n setStats({\n patients: patientsRes.data.length,\n doctors: doctorsRes.data.length,\n appointments: appointmentsRes.data.length\n });\n }\n } catch (error) {\n console.error('Error fetching stats:', error);\n } finally {\n setLoading(false);\n }\n };\n fetchStats();\n }, []);\n if (loading) return /*#__PURE__*/_jsxDEV(Loading, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 79,\n columnNumber: 23\n }, this);\n if (isPatient) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-wrapper\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-heading\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"page-title\",\n children: [\"Welcome, \", /*#__PURE__*/_jsxDEV(\"em\", {\n children: [user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 47\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-date\",\n children: [\"Saturday \\xB7 \", new Date().toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 86,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 84,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divider\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 88,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n marginBottom: '16px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Information\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 93,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 92,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n fontSize: '15px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 96,\n columnNumber: 20\n }, this), \" \", user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 96,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"EMBG:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 97,\n columnNumber: 20\n }, this), \" \", user.username]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 97,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Role:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 98,\n columnNumber: 20\n }, this), \" Patient\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 98,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 95,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 91,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Actions\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 104,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 103,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n },\n children: [/*#__PURE__*/_jsxDEV(Link, {\n to: \"/appointments/new\",\n style: {\n display: 'block',\n padding: '8px 12px',\n background: '#e9d5ff',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '12px',\n fontWeight: '500'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#d8b4fe',\n onMouseLeave: e => e.currentTarget.style.background = '#e9d5ff',\n children: \"+ Schedule Appointment\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 107,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/appointments\",\n style: {\n display: 'block',\n padding: '8px 12px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '12px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"View My Appointments\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 120,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 106,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 102,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 90,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Appointments\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 139,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 138,\n columnNumber: 11\n }, this), userAppointments.length === 0 ? /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '12px'\n },\n children: \"No appointments scheduled\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 142,\n columnNumber: 13\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"table\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Doctor\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 148,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 149,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Time\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 150,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Status\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 151,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 147,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 146,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: userAppointments.map(apt => {\n var _apt$doctor, _apt$doctor2;\n return /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n children: [(_apt$doctor = apt.doctor) === null || _apt$doctor === void 0 ? void 0 : _apt$doctor.firstName, \" \", (_apt$doctor2 = apt.doctor) === null || _apt$doctor2 === void 0 ? void 0 : _apt$doctor2.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 157,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: apt.appointmentDate\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 158,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: apt.appointmentTime\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 159,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: /*#__PURE__*/_jsxDEV(\"span\", {\n className: `badge ${apt.status === 'SCHEDULED' ? 'badge-obs' : apt.status === 'COMPLETED' ? 'badge-stable' : 'badge-critical'}`,\n children: apt.status\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 160,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 160,\n columnNumber: 23\n }, this)]\n }, apt.appointmentId, true, {\n fileName: _jsxFileName,\n lineNumber: 156,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 154,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 145,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 144,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 137,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n alignItems: 'start'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n style: {\n paddingTop: '20px',\n paddingRight: '24px',\n paddingLeft: '24px',\n paddingBottom: '20px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n style: {\n marginBottom: '4px'\n },\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Medical Records\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 172,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 171,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/medical-records\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#5b21b6',\n color: 'white',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '600',\n marginTop: '14px'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#4c1d95',\n onMouseLeave: e => e.currentTarget.style.background = '#5b21b6',\n children: \"View Medical Records\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 174,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 170,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Billing Stats\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 192,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 191,\n columnNumber: 13\n }, this), patientBillings.length === 0 ? /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '14px'\n },\n children: \"No billing records\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 195,\n columnNumber: 15\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n padding: '10px',\n background: 'var(--color-neutral-200)',\n borderRadius: '6px',\n fontSize: '14px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Total Bills:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 199,\n columnNumber: 19\n }, this), \" \", patientBillings.length]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 198,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n padding: '10px',\n background: '#d1fae5',\n borderRadius: '6px',\n fontSize: '14px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Paid:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 202,\n columnNumber: 19\n }, this), \" $\", patientBillings.filter(b => b.paymentStatus === 'PAID').reduce((sum, b) => sum + (b.totalCost || 0), 0).toFixed(2)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 201,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n padding: '10px',\n background: '#fef3c7',\n borderRadius: '6px',\n fontSize: '14px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Pending:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 205,\n columnNumber: 19\n }, this), \" $\", patientBillings.filter(b => b.paymentStatus === 'PENDING').reduce((sum, b) => sum + (b.totalCost || 0), 0).toFixed(2)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 204,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/billing\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#5b21b6',\n color: 'white',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '600'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#4c1d95',\n onMouseLeave: e => e.currentTarget.style.background = '#5b21b6',\n children: \"View Billing Details\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 207,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 197,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 190,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 169,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 83,\n columnNumber: 7\n }, this);\n }\n if (isDoctor) {\n var _doctorInfo$departmen, _doctorInfo$level;\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-wrapper\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-heading\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"page-title\",\n children: [\"Welcome Dr. \", /*#__PURE__*/_jsxDEV(\"em\", {\n children: [user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 232,\n columnNumber: 50\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 232,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-date\",\n children: [\"Saturday \\xB7 \", new Date().toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 233,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 231,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divider\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 235,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n marginBottom: '16px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Information\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 240,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 239,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n fontSize: '15px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 243,\n columnNumber: 20\n }, this), \" \", user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 243,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Email:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 244,\n columnNumber: 20\n }, this), \" \", user.username]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 244,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Role:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 245,\n columnNumber: 20\n }, this), \" Doctor\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 245,\n columnNumber: 15\n }, this), doctorInfo && /*#__PURE__*/_jsxDEV(_Fragment, {\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Department:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 248,\n columnNumber: 24\n }, this), \" \", (_doctorInfo$departmen = doctorInfo.department) !== null && _doctorInfo$departmen !== void 0 && _doctorInfo$departmen.departmentName ? doctorInfo.department.departmentName.replace(/_DEPT$/, '').replace(/_/g, ' ').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' ') : 'N/A']\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 248,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Level:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 249,\n columnNumber: 24\n }, this), \" \", ((_doctorInfo$level = doctorInfo.level) === null || _doctorInfo$level === void 0 ? void 0 : _doctorInfo$level.level) || 'N/A']\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 249,\n columnNumber: 19\n }, this)]\n }, void 0, true)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 242,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 238,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Actions\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 257,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 256,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n },\n children: [/*#__PURE__*/_jsxDEV(Link, {\n to: \"/appointments/new\",\n style: {\n display: 'block',\n padding: '8px 12px',\n background: '#e9d5ff',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '12px',\n fontWeight: '500'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#d8b4fe',\n onMouseLeave: e => e.currentTarget.style.background = '#e9d5ff',\n children: \"+ Schedule Appointment\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 260,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/appointments\",\n style: {\n display: 'block',\n padding: '8px 12px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '12px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"View My Appointments\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 273,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 259,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 255,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 237,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Appointments\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 292,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 291,\n columnNumber: 11\n }, this), userAppointments.length === 0 ? /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '12px'\n },\n children: \"No appointments scheduled\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 295,\n columnNumber: 13\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"table\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 301,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 302,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Time\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 303,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Status\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 304,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 300,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 299,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: userAppointments.map(apt => {\n var _apt$patient, _apt$patient2;\n return /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n children: [(_apt$patient = apt.patient) === null || _apt$patient === void 0 ? void 0 : _apt$patient.firstName, \" \", (_apt$patient2 = apt.patient) === null || _apt$patient2 === void 0 ? void 0 : _apt$patient2.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 310,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: apt.appointmentDate\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 311,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: apt.appointmentTime\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 312,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: /*#__PURE__*/_jsxDEV(\"span\", {\n className: `badge ${apt.status === 'SCHEDULED' ? 'badge-obs' : apt.status === 'COMPLETED' ? 'badge-stable' : 'badge-critical'}`,\n children: apt.status\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 313,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 313,\n columnNumber: 23\n }, this)]\n }, apt.appointmentId, true, {\n fileName: _jsxFileName,\n lineNumber: 309,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 307,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 298,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 297,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 290,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 230,\n columnNumber: 7\n }, this);\n }\n if (isLabTechnician) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-wrapper\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-heading\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"page-title\",\n children: [\"Welcome, \", /*#__PURE__*/_jsxDEV(\"em\", {\n children: [user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 329,\n columnNumber: 47\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 329,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-date\",\n children: [\"Saturday \\xB7 \", new Date().toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 330,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 328,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divider\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 332,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n marginBottom: '16px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Information\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 337,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 336,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n fontSize: '15px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 340,\n columnNumber: 20\n }, this), \" \", user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 340,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Username:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 341,\n columnNumber: 20\n }, this), \" \", user.username]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 341,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Role:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 342,\n columnNumber: 20\n }, this), \" Lab Technician\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 342,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 339,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 335,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Actions\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 348,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 347,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/lab-tests\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"View Lab Tests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 350,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 346,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 334,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: [\"Pending Lab Tests (\", pendingLabTests.length, \")\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 368,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 367,\n columnNumber: 11\n }, this), pendingLabTests.length === 0 ? /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '12px'\n },\n children: \"No pending lab tests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 371,\n columnNumber: 13\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"table\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Test Name\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 377,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 378,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Doctor\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 379,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 380,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Notes\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 381,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 376,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 375,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: pendingLabTests.map(test => /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n children: test.testName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 387,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: test.patientName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 388,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: test.doctorName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 389,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: test.testDate\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 390,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: test.notes || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 391,\n columnNumber: 23\n }, this)]\n }, test.testId, true, {\n fileName: _jsxFileName,\n lineNumber: 386,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 384,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 374,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 373,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 366,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 327,\n columnNumber: 7\n }, this);\n }\n if (isBillingAdmin) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-wrapper\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-heading\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"page-title\",\n children: [\"Welcome, \", /*#__PURE__*/_jsxDEV(\"em\", {\n children: [user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 407,\n columnNumber: 47\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 407,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-date\",\n children: [\"Saturday \\xB7 \", new Date().toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 408,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 406,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divider\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 410,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n marginBottom: '16px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Your Information\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 415,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 414,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n fontSize: '15px'\n },\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Name:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 418,\n columnNumber: 20\n }, this), \" \", user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 418,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Username:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 419,\n columnNumber: 20\n }, this), \" \", user.username]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 419,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Role:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 420,\n columnNumber: 20\n }, this), \" Billing Administrator\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 420,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 417,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 413,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Actions\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 426,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 425,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/billing\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textAlign: 'center',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"View Billing\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 428,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 424,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 412,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px',\n marginBottom: '16px'\n },\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Links\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 447,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 446,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n },\n children: [/*#__PURE__*/_jsxDEV(Link, {\n to: \"/doctors\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#e9d5ff',\n color: '#1e1035',\n borderRadius: '6px',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#d8b4fe',\n onMouseLeave: e => e.currentTarget.style.background = '#e9d5ff',\n children: \"View Doctors\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 450,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/departments\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textDecoration: 'none',\n fontSize: '13px',\n fontWeight: '400'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"View Departments\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 462,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 449,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 445,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 444,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: [\"Billing Records (\", billings.length, \")\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 480,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 479,\n columnNumber: 11\n }, this), billings.length === 0 ? /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '12px'\n },\n children: \"No billing records\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 483,\n columnNumber: 13\n }, this) : /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"table\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 489,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Amount\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 490,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Status\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 491,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n children: \"Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 492,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 488,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 487,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: billings.map(bill => /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n children: bill.patientName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 498,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: [\"$\", bill.totalCost]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 499,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: /*#__PURE__*/_jsxDEV(\"span\", {\n className: `badge ${bill.paymentStatus === 'PAID' ? 'badge-paid' : bill.paymentStatus === 'PENDING' ? 'badge-pending' : 'badge-cancelled'}`,\n children: bill.paymentStatus\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 500,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 500,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n children: bill.paymentDate || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 501,\n columnNumber: 23\n }, this)]\n }, bill.billId, true, {\n fileName: _jsxFileName,\n lineNumber: 497,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 495,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 486,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 485,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 478,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 405,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-wrapper\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-heading\",\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"page-title\",\n children: [\"Welcome, \", /*#__PURE__*/_jsxDEV(\"em\", {\n children: [user.firstName, \" \", user.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 516,\n columnNumber: 45\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 516,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"page-date\",\n children: [\"Saturday \\xB7 \", new Date().toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n })]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 517,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 515,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"divider\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 519,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"stat-grid\",\n children: [/*#__PURE__*/_jsxDEV(StatCard, {\n title: \"Total Patients\",\n count: stats.patients,\n delta: \"+2.5% this week\",\n statClass: \"s1\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 522,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(StatCard, {\n title: \"Total Doctors\",\n count: stats.doctors,\n delta: \"+1 this month\",\n statClass: \"s2\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 528,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(StatCard, {\n title: \"Appointments Today\",\n count: stats.appointments,\n delta: \"+5 newly scheduled\",\n statClass: \"s3\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 534,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(StatCard, {\n title: \"Departments\",\n count: 5,\n delta: \"All active\",\n statClass: \"s4\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 540,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 521,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '16px'\n },\n children: [/*#__PURE__*/_jsxDEV(QuickActionsCard, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 549,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(RecentActivityCard, {}, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 550,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 548,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 514,\n columnNumber: 5\n }, this);\n}\n_s(Dashboard, \"OebGDapjw9Ni97c2soTKfTF7Q58=\");\n_c = Dashboard;\nfunction StatCard({\n title,\n count,\n delta,\n statClass\n}) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: `stat-card ${statClass}`,\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"stat-accent\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 559,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"stat-label\",\n children: title\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 560,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"stat-value\",\n children: count.toLocaleString()\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 561,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"stat-delta\",\n children: delta\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 562,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 558,\n columnNumber: 5\n }, this);\n}\n_c2 = StatCard;\nfunction QuickActionsCard() {\n const user = JSON.parse(localStorage.getItem('user') || '{}');\n\n // Lab technicians and billing admins should not see admin quick actions\n if (user.role === 'LAB_TECHNICIAN' || user.role === 'BILLING_ADMIN') {\n return null;\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Quick Actions\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 578,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 577,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px'\n },\n children: [/*#__PURE__*/_jsxDEV(Link, {\n to: \"/patients/new\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#e9d5ff',\n color: '#1e1035',\n borderRadius: '6px',\n textDecoration: 'none',\n transition: 'background 0.2s',\n fontSize: '13px',\n fontWeight: '600'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#d8b4fe',\n onMouseLeave: e => e.currentTarget.style.background = '#e9d5ff',\n children: \"+ Add New Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 581,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/doctors/new\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#bfdbfe',\n color: '#1e1035',\n borderRadius: '6px',\n textDecoration: 'none',\n transition: 'background 0.2s',\n fontSize: '13px',\n fontWeight: '600'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#93c5fd',\n onMouseLeave: e => e.currentTarget.style.background = '#bfdbfe',\n children: \"+ Add New Doctor\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 594,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(Link, {\n to: \"/appointments/new\",\n style: {\n display: 'block',\n padding: '10px 14px',\n background: '#e9d5ff',\n color: '#1e1035',\n borderRadius: '6px',\n textDecoration: 'none',\n transition: 'background 0.2s',\n fontSize: '13px',\n fontWeight: '600'\n },\n onMouseEnter: e => e.currentTarget.style.background = '#d8b4fe',\n onMouseLeave: e => e.currentTarget.style.background = '#e9d5ff',\n children: \"+ Create Appointment\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 607,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 580,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 576,\n columnNumber: 5\n }, this);\n}\n_c3 = QuickActionsCard;\nfunction RecentActivityCard() {\n const user = JSON.parse(localStorage.getItem('user') || '{}');\n\n // Lab technicians and billing admins should not see admin dashboard cards\n if (user.role === 'LAB_TECHNICIAN' || user.role === 'BILLING_ADMIN') {\n return null;\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"card-header\",\n children: [/*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"card-title\",\n children: \"Recent Activity\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 636,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n className: \"card-link\",\n children: \"View all\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 637,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 635,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n style: {\n color: 'var(--color-neutral-600)',\n fontSize: '12px'\n },\n children: \"Activity feed coming soon...\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 639,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 634,\n columnNumber: 5\n }, this);\n}\n_c4 = RecentActivityCard;\nexport default Dashboard;\nvar _c, _c2, _c3, _c4;\n$RefreshReg$(_c, \"Dashboard\");\n$RefreshReg$(_c2, \"StatCard\");\n$RefreshReg$(_c3, \"QuickActionsCard\");\n$RefreshReg$(_c4, \"RecentActivityCard\");","map":{"version":3,"names":["React","useState","useEffect","Link","patientService","doctorService","appointmentService","labService","billingService","Loading","jsxDEV","_jsxDEV","Fragment","_Fragment","Dashboard","_s","stats","setStats","patients","doctors","appointments","userAppointments","setUserAppointments","doctorInfo","setDoctorInfo","pendingLabTests","setPendingLabTests","billings","setBillings","patientBillings","setPatientBillings","loading","setLoading","user","JSON","parse","localStorage","getItem","isPatient","role","isDoctor","isLabTechnician","isBillingAdmin","fetchStats","appointmentsRes","billingRes","Promise","all","getAppointmentsForPatient","patientId","getBillingHistoryForPatient","data","doctorRes","getAppointmentsForDoctor","doctorId","getDoctorById","pendingRes","getPendingLabTests","billingsRes","getAllBillings","patientsRes","doctorsRes","getAllPatients","getAllDoctors","getAllAppointments","length","error","console","fileName","_jsxFileName","lineNumber","columnNumber","className","children","firstName","lastName","Date","toLocaleDateString","month","day","year","style","display","gridTemplateColumns","gap","marginBottom","flexDirection","fontSize","username","to","padding","background","color","borderRadius","textAlign","textDecoration","fontWeight","onMouseEnter","e","currentTarget","onMouseLeave","map","apt","_apt$doctor","_apt$doctor2","doctor","appointmentDate","appointmentTime","status","appointmentId","alignItems","paddingTop","paddingRight","paddingLeft","paddingBottom","marginTop","filter","b","paymentStatus","reduce","sum","totalCost","toFixed","_doctorInfo$departmen","_doctorInfo$level","department","departmentName","replace","split","word","charAt","toUpperCase","slice","toLowerCase","join","level","_apt$patient","_apt$patient2","patient","test","testName","patientName","doctorName","testDate","notes","testId","bill","paymentDate","billId","StatCard","title","count","delta","statClass","QuickActionsCard","RecentActivityCard","_c","toLocaleString","_c2","transition","_c3","_c4","$RefreshReg$"],"sources":["C:/Users/User/Downloads/medora5/frontend/src/pages/Dashboard.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { patientService } from '../services/patientService';\nimport { doctorService } from '../services/doctorService';\nimport { appointmentService } from '../services/appointmentService';\nimport { labService } from '../services/labService';\nimport { billingService } from '../services/billingService';\nimport Loading from '../components/Loading';\n\nfunction Dashboard() {\n const [stats, setStats] = useState({\n patients: 0,\n doctors: 0,\n appointments: 0,\n });\n const [userAppointments, setUserAppointments] = useState([]);\n const [doctorInfo, setDoctorInfo] = useState(null);\n const [pendingLabTests, setPendingLabTests] = useState([]);\n const [billings, setBillings] = useState([]);\n const [patientBillings, setPatientBillings] = useState([]);\n const [loading, setLoading] = useState(true);\n const user = JSON.parse(localStorage.getItem('user') || '{}');\n const isPatient = user.role === 'PATIENT';\n const isDoctor = user.role === 'DOCTOR';\n const isLabTechnician = user.role === 'LAB_TECHNICIAN';\n const isBillingAdmin = user.role === 'BILLING_ADMIN';\n\n useEffect(() => {\n const fetchStats = async () => {\n try {\n if (isPatient) {\n // For patients, fetch their own appointments, medical records, and billing\n const [appointmentsRes, billingRes] = await Promise.all([\n appointmentService.getAppointmentsForPatient(user.patientId),\n billingService.getBillingHistoryForPatient(user.patientId)\n ]);\n setUserAppointments(appointmentsRes.data || []);\n setPatientBillings(billingRes.data || []);\n } else if (isDoctor) {\n // For doctors, fetch their own appointments and full doctor information\n const [appointmentsRes, doctorRes] = await Promise.all([\n appointmentService.getAppointmentsForDoctor(user.doctorId),\n doctorService.getDoctorById(user.doctorId),\n ]);\n setUserAppointments(appointmentsRes.data || []);\n setDoctorInfo(doctorRes.data);\n } else if (isLabTechnician) {\n // For lab technicians, fetch pending lab tests\n const pendingRes = await labService.getPendingLabTests();\n setPendingLabTests(pendingRes.data || []);\n } else if (isBillingAdmin) {\n // For billing admins, fetch all billing records\n const billingsRes = await billingService.getAllBillings();\n setBillings(billingsRes.data || []);\n } else {\n // For admin/staff, fetch all stats\n const [patientsRes, doctorsRes, appointmentsRes] = await Promise.all([\n patientService.getAllPatients(),\n doctorService.getAllDoctors(),\n appointmentService.getAllAppointments(),\n ]);\n\n setStats({\n patients: patientsRes.data.length,\n doctors: doctorsRes.data.length,\n appointments: appointmentsRes.data.length,\n });\n }\n } catch (error) {\n console.error('Error fetching stats:', error);\n } finally {\n setLoading(false);\n }\n };\n\n fetchStats();\n }, []);\n\n if (loading) return
No appointments scheduled
\n ) : (\n| Doctor | \nDate | \nTime | \nStatus | \n
|---|---|---|---|
| {apt.doctor?.firstName} {apt.doctor?.lastName} | \n{apt.appointmentDate} | \n{apt.appointmentTime} | \n{apt.status} | \n
No billing records
\n ) : (\nNo appointments scheduled
\n ) : (\n| Patient | \nDate | \nTime | \nStatus | \n
|---|---|---|---|
| {apt.patient?.firstName} {apt.patient?.lastName} | \n{apt.appointmentDate} | \n{apt.appointmentTime} | \n{apt.status} | \n
No pending lab tests
\n ) : (\n| Test Name | \nPatient | \nDoctor | \nTest Date | \nNotes | \n
|---|---|---|---|---|
| {test.testName} | \n{test.patientName} | \n{test.doctorName} | \n{test.testDate} | \n{test.notes || 'N/A'} | \n
No billing records
\n ) : (\n| Patient | \nAmount | \nStatus | \nDate | \n
|---|---|---|---|
| {bill.patientName} | \n${bill.totalCost} | \n{bill.paymentStatus} | \n{bill.paymentDate || 'N/A'} | \n
{title}
\n{count.toLocaleString()}
\n{delta}
\nActivity feed coming soon...
\n