{"ast":null,"code":"var _jsxFileName = \"C:\\\\Users\\\\User\\\\Downloads\\\\medora5\\\\frontend\\\\src\\\\pages\\\\lab-tests\\\\LabTestList.js\",\n _s = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport { patientService } from '../../services/patientService';\nimport { labService } from '../../services/labService';\nimport ErrorAlert from '../../components/ErrorAlert';\nimport { jsxDEV as _jsxDEV, Fragment as _Fragment } from \"react/jsx-dev-runtime\";\nfunction LabTestList() {\n _s();\n const [user, setUser] = useState({});\n const isLabTechnician = user.role === 'LAB_TECHNICIAN';\n const [patient, setPatient] = useState(null);\n const [embg, setEmbg] = useState('');\n const [searched, setSearched] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [availableTests, setAvailableTests] = useState([]);\n const [labTestRequests, setLabTestRequests] = useState([]);\n const [labResults, setLabResults] = useState([]);\n const [pendingTests, setPendingTests] = useState([]);\n const [submittedTests, setSubmittedTests] = useState([]);\n const [selectedTest, setSelectedTest] = useState(null);\n const [showRequestForm, setShowRequestForm] = useState(false);\n const [requestData, setRequestData] = useState({\n testId: '',\n testDate: new Date().toISOString().split('T')[0],\n notes: ''\n });\n const [submitFormData, setSubmitFormData] = useState({\n results: '',\n resultDate: new Date().toISOString().split('T')[0]\n });\n\n // Filter states for pending tests\n const [pendingFilters, setPendingFilters] = useState({\n testName: '',\n patientName: '',\n testDate: ''\n });\n\n // Filter states for submitted tests\n const [submittedFilters, setSubmittedFilters] = useState({\n testName: '',\n patientName: '',\n testDate: ''\n });\n\n // Load user from localStorage and listen for changes\n useEffect(() => {\n const loadUser = () => {\n const userStr = localStorage.getItem('user');\n console.log('[LabTestList] Loading user from localStorage:', userStr);\n if (userStr) {\n try {\n const parsedUser = JSON.parse(userStr);\n console.log('[LabTestList] Parsed user:', parsedUser);\n setUser(parsedUser);\n } catch (err) {\n console.error('Failed to parse user:', err);\n setUser({});\n }\n } else {\n console.log('[LabTestList] No user in localStorage');\n setUser({});\n }\n };\n console.log('[LabTestList] useEffect running - loading user');\n loadUser();\n\n // Listen for storage changes (other tabs/windows)\n window.addEventListener('storage', loadUser);\n\n // Listen for custom event (same tab changes)\n window.addEventListener('userStorageChange', loadUser);\n return () => {\n window.removeEventListener('storage', loadUser);\n window.removeEventListener('userStorageChange', loadUser);\n };\n }, []);\n useEffect(() => {\n if (isLabTechnician) {\n loadLabTestsData();\n }\n }, [isLabTechnician]);\n const loadLabTestsData = async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Load pending tests\n const pendingRes = await labService.getPendingLabTests();\n setPendingTests(pendingRes.data || []);\n\n // Try to load submitted tests, but don't fail if this endpoint doesn't exist\n try {\n const submittedRes = await labService.getAllSubmittedLabResults();\n setSubmittedTests(submittedRes.data || []);\n } catch (err) {\n console.warn('Could not load submitted tests:', err);\n setSubmittedTests([]);\n }\n } catch (err) {\n setError('Failed to load pending lab tests');\n setPendingTests([]);\n } finally {\n setLoading(false);\n }\n };\n const handleSearch = async e => {\n e.preventDefault();\n setError(null);\n setLoading(true);\n try {\n if (!embg.trim()) {\n setError('Please enter an EMBG');\n setLoading(false);\n return;\n }\n const patientResponse = await patientService.getPatientByEmbg(embg);\n setPatient(patientResponse.data);\n setSearched(true);\n\n // Fetch available tests\n const testsResponse = await labService.getAllLabTests();\n setAvailableTests(testsResponse.data);\n\n // Fetch medical record for patient\n const {\n medicalRecordService\n } = await import('../../services/medicalRecordService');\n const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(patientResponse.data.patientId);\n\n // Fetch existing test requests for patient\n const requestsResponse = await labService.getLabTestRequestsForPatient(patientResponse.data.patientId);\n setLabTestRequests(requestsResponse.data);\n\n // Fetch lab results for medical record\n const resultsResponse = await labService.getLabResultsForMedicalRecord(medicalRecordRes.data.recordId);\n setLabResults(resultsResponse.data);\n } catch (err) {\n setError(`Patient with EMBG ${embg} not found`);\n setPatient(null);\n } finally {\n setLoading(false);\n }\n };\n const handleRequestTest = async e => {\n e.preventDefault();\n setError(null);\n if (!requestData.testId) {\n setError('Please select a test');\n return;\n }\n if (!patient) {\n setError('Patient not found');\n return;\n }\n try {\n setLoading(true);\n\n // Get doctor ID from logged-in user\n const doctorId = user.doctorId;\n const request = {\n patientId: patient.patientId,\n medicalRecordId: patient.patientId,\n // Assuming medical record ID matches patient ID\n doctorId: parseInt(doctorId),\n testId: parseInt(requestData.testId),\n testDate: requestData.testDate,\n notes: requestData.notes\n };\n console.log('User object:', user);\n console.log('Sending lab test request with doctorId:', doctorId, 'Full request:', request);\n await labService.requestLabTest(request);\n\n // Refresh the test requests\n const requestsResponse = await labService.getLabTestRequestsForPatient(patient.patientId);\n setLabTestRequests(requestsResponse.data);\n\n // Reset form\n setRequestData({\n testId: '',\n testDate: new Date().toISOString().split('T')[0],\n notes: ''\n });\n setShowRequestForm(false);\n setError(null);\n } catch (err) {\n var _err$response, _err$response$data;\n setError('Failed to request lab test: ' + ((_err$response = err.response) === null || _err$response === void 0 ? void 0 : (_err$response$data = _err$response.data) === null || _err$response$data === void 0 ? void 0 : _err$response$data.error) || err.message);\n } finally {\n setLoading(false);\n }\n };\n const handleSubmitResult = async e => {\n e.preventDefault();\n setError(null);\n if (!submitFormData.results.trim()) {\n setError('Please enter test results');\n return;\n }\n if (!selectedTest) {\n setError('No test selected');\n return;\n }\n try {\n setLoading(true);\n const {\n medicalRecordService\n } = await import('../../services/medicalRecordService');\n const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(selectedTest.patientId);\n const resultData = {\n medicalRecordId: medicalRecordRes.data.recordId,\n testId: selectedTest.testId,\n results: submitFormData.results,\n resultDate: submitFormData.resultDate\n };\n await labService.submitLabResult(resultData);\n\n // Refresh pending tests\n await loadLabTestsData();\n\n // Reset form\n setSelectedTest(null);\n setSubmitFormData({\n results: '',\n resultDate: new Date().toISOString().split('T')[0]\n });\n\n // Show success message\n setError(null);\n alert('Lab result submitted successfully!');\n\n // Refresh the lab tests data\n await loadLabTestsData();\n\n // Reset form\n setSelectedTest(null);\n setSubmitFormData({\n results: '',\n resultDate: new Date().toISOString().split('T')[0]\n });\n } catch (err) {\n var _err$response2, _err$response2$data;\n setError('Failed to submit lab result: ' + (((_err$response2 = err.response) === null || _err$response2 === void 0 ? void 0 : (_err$response2$data = _err$response2.data) === null || _err$response2$data === void 0 ? void 0 : _err$response2$data.error) || err.message));\n } finally {\n setLoading(false);\n }\n };\n if (isLabTechnician) {\n return /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"text-3xl font-bold mb-6\",\n style: {\n color: '#7c3aed'\n },\n children: \"Lab Tests - Submit Results\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 269,\n columnNumber: 9\n }, this), error && /*#__PURE__*/_jsxDEV(ErrorAlert, {\n message: error,\n onClose: () => setError(null)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 271,\n columnNumber: 19\n }, this), selectedTest ?\n /*#__PURE__*/\n // Submit Result Form\n _jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6 mb-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Submit Lab Result\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 276,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mb-4 p-4 bg-gray-50 rounded-lg\",\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Test:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 278,\n columnNumber: 35\n }, this), \" \", selectedTest.testName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 278,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Patient:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 279,\n columnNumber: 35\n }, this), \" \", selectedTest.patientName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 279,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Doctor:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 280,\n columnNumber: 35\n }, this), \" \", selectedTest.doctorName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 280,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mb-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Test Date:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 281,\n columnNumber: 35\n }, this), \" \", selectedTest.testDate]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 281,\n columnNumber: 15\n }, this), selectedTest.notes && /*#__PURE__*/_jsxDEV(\"p\", {\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Notes:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 282,\n columnNumber: 41\n }, this), \" \", selectedTest.notes]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 282,\n columnNumber: 38\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 277,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n onSubmit: handleSubmitResult,\n className: \"space-y-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test Results *\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 287,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"textarea\", {\n value: submitFormData.results,\n onChange: e => setSubmitFormData({\n ...submitFormData,\n results: e.target.value\n }),\n placeholder: \"Enter detailed test results\",\n className: \"w-full px-4 py-2 border rounded-lg\",\n rows: \"4\",\n required: true\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 288,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 286,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Result Date *\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 299,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"date\",\n value: submitFormData.resultDate,\n onChange: e => setSubmitFormData({\n ...submitFormData,\n resultDate: e.target.value\n }),\n className: \"w-full px-4 py-2 border rounded-lg\",\n required: true\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 300,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 298,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"button\", {\n type: \"submit\",\n disabled: loading,\n style: {\n background: loading ? '#d1d5db' : '#bfdbfe',\n color: '#1e1035',\n padding: '8px 24px',\n borderRadius: '6px',\n border: 'none',\n cursor: loading ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontWeight: '400'\n },\n onMouseEnter: e => !loading && (e.currentTarget.style.background = '#93c5fd'),\n onMouseLeave: e => !loading && (e.currentTarget.style.background = '#bfdbfe'),\n children: loading ? 'Submitting...' : 'Submit Result'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 310,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"button\",\n onClick: () => {\n setSelectedTest(null);\n setSubmitFormData({\n results: '',\n resultDate: new Date().toISOString().split('T')[0]\n });\n },\n className: \"bg-gray-400 text-white px-6 py-2 rounded hover:bg-gray-500\",\n children: \"Cancel\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 328,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 309,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 285,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 275,\n columnNumber: 11\n }, this) :\n /*#__PURE__*/\n // Pending Tests List\n _jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow overflow-hidden\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 border-b\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-xl font-bold\",\n children: [\"Pending Lab Tests (\", pendingTests.length, \")\"]\n }, void 0, true, {\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), pendingTests.length === 0 ? /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 text-center text-gray-600\",\n children: \"No pending lab tests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 352,\n columnNumber: 15\n }, this) : /*#__PURE__*/_jsxDEV(_Fragment, {\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 border-b bg-gray-50\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-sm font-semibold mb-4\",\n children: \"Filters\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 359,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 362,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n placeholder: \"Filter by test name...\",\n value: pendingFilters.testName,\n onChange: e => setPendingFilters({\n ...pendingFilters,\n testName: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 363,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 361,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 372,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n placeholder: \"Filter by patient name...\",\n value: pendingFilters.patientName,\n onChange: e => setPendingFilters({\n ...pendingFilters,\n patientName: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 373,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 371,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 382,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"date\",\n value: pendingFilters.testDate,\n onChange: e => setPendingFilters({\n ...pendingFilters,\n testDate: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 383,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 381,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 360,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setPendingFilters({\n testName: '',\n patientName: '',\n testDate: ''\n }),\n className: \"mt-4 bg-gray-300 text-gray-700 px-4 py-2 rounded text-sm hover:bg-gray-400\",\n children: \"Clear Filters\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 391,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 358,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"w-full\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n className: \"bg-gray-100\",\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 403,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 404,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Doctor\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 405,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Requested\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 406,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 407,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Notes\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 408,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Action\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 409,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 402,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 401,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: pendingTests.filter(test => {\n const testName = (test.testName || '').toLowerCase();\n const patientName = (test.patientName || '').toLowerCase();\n const testDate = test.testDate || '';\n return testName.includes(pendingFilters.testName.toLowerCase()) && patientName.includes(pendingFilters.patientName.toLowerCase()) && (pendingFilters.testDate === '' || testDate === pendingFilters.testDate);\n }).map((test, index) => /*#__PURE__*/_jsxDEV(\"tr\", {\n className: \"border-t hover:bg-gray-50\",\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 font-medium\",\n children: test.testName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 427,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: test.patientName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 428,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: test.doctorName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 429,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 text-green-600\",\n children: test.requestDate\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 430,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 text-purple-600\",\n children: test.testDate\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 431,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 text-gray-600 text-sm\",\n children: test.notes || '-'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 432,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setSelectedTest(test),\n style: {\n background: '#bfdbfe',\n color: '#1e1035',\n padding: '6px 12px',\n borderRadius: '4px',\n border: 'none',\n cursor: 'pointer',\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: \"Submit Result\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 434,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 433,\n columnNumber: 23\n }, this)]\n }, index, true, {\n fileName: _jsxFileName,\n lineNumber: 426,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 412,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 400,\n columnNumber: 17\n }, this)]\n }, void 0, true)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 346,\n columnNumber: 11\n }, this), !selectedTest && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow overflow-hidden mt-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 border-b\",\n children: /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-xl font-bold\",\n children: [\"Submitted Lab Results History (\", submittedTests.length, \")\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 465,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 464,\n columnNumber: 13\n }, this), submittedTests.length === 0 ? /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 text-center text-gray-600\",\n children: \"No submitted lab results yet\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 469,\n columnNumber: 15\n }, this) : /*#__PURE__*/_jsxDEV(_Fragment, {\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"p-6 border-b bg-gray-50\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-sm font-semibold mb-4\",\n children: \"Filters\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 476,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 479,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n placeholder: \"Filter by test name...\",\n value: submittedFilters.testName,\n onChange: e => setSubmittedFilters({\n ...submittedFilters,\n testName: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 480,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 478,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 489,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n placeholder: \"Filter by patient name...\",\n value: submittedFilters.patientName,\n onChange: e => setSubmittedFilters({\n ...submittedFilters,\n patientName: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 490,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 488,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 499,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"date\",\n value: submittedFilters.testDate,\n onChange: e => setSubmittedFilters({\n ...submittedFilters,\n testDate: e.target.value\n }),\n className: \"w-full px-3 py-2 border rounded-lg text-sm\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 500,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 498,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 477,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setSubmittedFilters({\n testName: '',\n patientName: '',\n testDate: ''\n }),\n className: \"mt-4 bg-gray-300 text-gray-700 px-4 py-2 rounded text-sm hover:bg-gray-400\",\n children: \"Clear Filters\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 508,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 475,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"table\", {\n className: \"w-full\",\n children: [/*#__PURE__*/_jsxDEV(\"thead\", {\n className: \"bg-gray-100\",\n children: /*#__PURE__*/_jsxDEV(\"tr\", {\n children: [/*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 520,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 521,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 522,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Result Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 523,\n columnNumber: 23\n }, this), /*#__PURE__*/_jsxDEV(\"th\", {\n className: \"px-6 py-3 text-left text-sm font-semibold\",\n children: \"Status\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 524,\n columnNumber: 23\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 519,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 518,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"tbody\", {\n children: submittedTests.filter(test => {\n const testName = (test.testName || '').toLowerCase();\n const patientName = (test.patientName || '').toLowerCase();\n const testDate = test.testDate || '';\n return testName.includes(submittedFilters.testName.toLowerCase()) && patientName.includes(submittedFilters.patientName.toLowerCase()) && (submittedFilters.testDate === '' || testDate === submittedFilters.testDate);\n }).map((test, index) => /*#__PURE__*/_jsxDEV(\"tr\", {\n className: \"border-t hover:bg-gray-50\",\n children: [/*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 font-medium\",\n children: test.testName || test.description || 'Lab Test'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 542,\n columnNumber: 27\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: test.patientName || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 543,\n columnNumber: 27\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: test.testDate || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 544,\n columnNumber: 27\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3 text-green-600\",\n children: test.resultDate || test.createdDate || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 545,\n columnNumber: 27\n }, this), /*#__PURE__*/_jsxDEV(\"td\", {\n className: \"px-6 py-3\",\n children: /*#__PURE__*/_jsxDEV(\"span\", {\n className: \"px-3 py-1 bg-green-100 text-green-800 rounded-full text-sm font-semibold\",\n children: \"Submitted\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 547,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 546,\n columnNumber: 27\n }, this)]\n }, index, true, {\n fileName: _jsxFileName,\n lineNumber: 541,\n columnNumber: 25\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 527,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 517,\n columnNumber: 17\n }, this)]\n }, void 0, true)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 463,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 268,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"h1\", {\n className: \"text-3xl font-bold mb-6\",\n style: {\n color: '#7c3aed'\n },\n children: \"Lab Tests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 565,\n columnNumber: 7\n }, this), error && /*#__PURE__*/_jsxDEV(ErrorAlert, {\n message: error,\n onClose: () => setError(null)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 567,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6 mb-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Search Patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 571,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n onSubmit: handleSearch,\n className: \"space-y-4\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex-1\",\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Patient EMBG\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 575,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n value: embg,\n onChange: e => setEmbg(e.target.value),\n placeholder: \"e.g., 1402994123456\",\n className: \"w-full px-4 py-2 border rounded-lg\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 576,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 574,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-end\",\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"submit\",\n disabled: loading,\n className: \"bg-purple-600 text-white px-8 py-2 rounded-full hover:bg-purple-700 disabled:bg-gray-400\",\n children: loading ? 'Searching...' : 'Search'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 585,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 584,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 573,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 572,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 570,\n columnNumber: 7\n }, this), searched && patient && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex justify-between items-start mb-4\",\n children: [/*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"text-2xl font-bold\",\n children: [patient.firstName, \" \", patient.lastName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 603,\n columnNumber: 15\n }, this), !showRequestForm && /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: () => setShowRequestForm(true),\n className: \"bg-green-600 text-white px-4 py-2 rounded hover:bg-green-700\",\n children: \"Request Lab Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 605,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 602,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-4 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: \"EMBG\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 615,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"font-semibold\",\n children: patient.embg\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 616,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 614,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: \"Blood Type\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 619,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"font-semibold\",\n children: patient.bloodType || 'N/A'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 620,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 618,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: \"Date of Birth\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 623,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"font-semibold\",\n children: patient.dateOfBirth\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 624,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 622,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 613,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 601,\n columnNumber: 11\n }, this), showRequestForm && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Request Lab Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 632,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n onSubmit: handleRequestTest,\n className: \"space-y-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-2 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 636,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"select\", {\n value: requestData.testId,\n onChange: e => setRequestData({\n ...requestData,\n testId: e.target.value\n }),\n className: \"w-full px-4 py-2 border rounded-lg\",\n required: true,\n children: [/*#__PURE__*/_jsxDEV(\"option\", {\n value: \"\",\n children: \"Select a test\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 643,\n columnNumber: 23\n }, this), availableTests.map(test => /*#__PURE__*/_jsxDEV(\"option\", {\n value: test.testId,\n children: [test.testName, \" ($\", test.cost, \")\"]\n }, test.testId, true, {\n fileName: _jsxFileName,\n lineNumber: 645,\n columnNumber: 25\n }, this))]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 637,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 635,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Test Date\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 652,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"date\",\n value: requestData.testDate,\n onChange: e => setRequestData({\n ...requestData,\n testDate: e.target.value\n }),\n className: \"w-full px-4 py-2 border rounded-lg\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 653,\n columnNumber: 21\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 651,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 634,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n className: \"block text-sm font-semibold mb-2\",\n children: \"Notes\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 662,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"textarea\", {\n value: requestData.notes,\n onChange: e => setRequestData({\n ...requestData,\n notes: e.target.value\n }),\n placeholder: \"Additional notes for the lab technician\",\n className: \"w-full px-4 py-2 border rounded-lg\",\n rows: \"3\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 663,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 661,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"button\", {\n type: \"submit\",\n disabled: loading,\n className: \"bg-green-600 text-white px-6 py-2 rounded hover:bg-green-700 disabled:bg-gray-400\",\n children: loading ? 'Requesting...' : 'Request Test'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 672,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"button\",\n onClick: () => setShowRequestForm(false),\n className: \"bg-gray-400 text-white px-6 py-2 rounded hover:bg-gray-500\",\n children: \"Cancel\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 679,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 671,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 633,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 631,\n columnNumber: 13\n }, this), labTestRequests && labTestRequests.length > 0 && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Lab Test Requests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 694,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-3\",\n children: labTestRequests.map(request => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"border-l-4 border-purple-500 pl-4 py-2\",\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"font-semibold text-lg\",\n children: request.testName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 698,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: [\"Requested by: \", request.doctorName]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 699,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: [\"Test Date: \", request.requestDate]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 700,\n columnNumber: 21\n }, this), request.notes && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: [\"Notes: \", request.notes]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 702,\n columnNumber: 23\n }, this)]\n }, request.testId, true, {\n fileName: _jsxFileName,\n lineNumber: 697,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 695,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 693,\n columnNumber: 13\n }, this), labResults && labResults.length > 0 && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-white rounded-lg shadow p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-xl font-bold mb-4\",\n children: \"Lab Test Results\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 713,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-4\",\n children: labResults.map(result => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"border-l-4 border-green-500 pl-4 py-3 bg-green-50 rounded\",\n children: [/*#__PURE__*/_jsxDEV(\"p\", {\n className: \"font-semibold text-lg text-green-700\",\n children: result.testName\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 717,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-700 mt-2\",\n children: [/*#__PURE__*/_jsxDEV(\"strong\", {\n children: \"Results:\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 718,\n columnNumber: 63\n }, this), \" \", result.results]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 718,\n columnNumber: 21\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-600\",\n children: [\"Result Date: \", result.resultDate]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 719,\n columnNumber: 21\n }, this)]\n }, result.resultId, true, {\n fileName: _jsxFileName,\n lineNumber: 716,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 714,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 712,\n columnNumber: 13\n }, this), labTestRequests && labTestRequests.length > 0 && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-yellow-50 rounded-lg p-6\",\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"text-lg font-semibold text-yellow-800 mb-3\",\n children: \"Lab Technician: Submit Test Results\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 729,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-sm text-gray-700 mb-4\",\n children: [labTestRequests.length, \" test\", labTestRequests.length !== 1 ? 's' : '', \" awaiting results\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 730,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"a\", {\n href: \"/lab-tests/results\",\n className: \"inline-block bg-yellow-600 text-white px-6 py-2 rounded hover:bg-yellow-700\",\n children: \"Submit Lab Results\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 733,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 728,\n columnNumber: 13\n }, this), (!labTestRequests || labTestRequests.length === 0) && !(labResults !== null && labResults !== void 0 && labResults.length) && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-blue-50 rounded-lg p-6 text-center\",\n children: /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-gray-600\",\n children: \"No lab test requests for this patient\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 745,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 744,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 599,\n columnNumber: 9\n }, this), !searched && /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"bg-gray-50 rounded-lg p-12 text-center\",\n children: /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"text-gray-600 text-lg\",\n children: \"Enter a patient EMBG to request lab tests\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 754,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 753,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 564,\n columnNumber: 5\n }, this);\n}\n_s(LabTestList, \"gf7R9hSf9mJJsqaKQrqRACQxO00=\");\n_c = LabTestList;\nexport default LabTestList;\nvar _c;\n$RefreshReg$(_c, \"LabTestList\");","map":{"version":3,"names":["React","useState","useEffect","patientService","labService","ErrorAlert","jsxDEV","_jsxDEV","Fragment","_Fragment","LabTestList","_s","user","setUser","isLabTechnician","role","patient","setPatient","embg","setEmbg","searched","setSearched","loading","setLoading","error","setError","availableTests","setAvailableTests","labTestRequests","setLabTestRequests","labResults","setLabResults","pendingTests","setPendingTests","submittedTests","setSubmittedTests","selectedTest","setSelectedTest","showRequestForm","setShowRequestForm","requestData","setRequestData","testId","testDate","Date","toISOString","split","notes","submitFormData","setSubmitFormData","results","resultDate","pendingFilters","setPendingFilters","testName","patientName","submittedFilters","setSubmittedFilters","loadUser","userStr","localStorage","getItem","console","log","parsedUser","JSON","parse","err","window","addEventListener","removeEventListener","loadLabTestsData","pendingRes","getPendingLabTests","data","submittedRes","getAllSubmittedLabResults","warn","handleSearch","e","preventDefault","trim","patientResponse","getPatientByEmbg","testsResponse","getAllLabTests","medicalRecordService","medicalRecordRes","getMedicalRecordByPatientId","patientId","requestsResponse","getLabTestRequestsForPatient","resultsResponse","getLabResultsForMedicalRecord","recordId","handleRequestTest","doctorId","request","medicalRecordId","parseInt","requestLabTest","_err$response","_err$response$data","response","message","handleSubmitResult","resultData","submitLabResult","alert","_err$response2","_err$response2$data","children","className","style","color","fileName","_jsxFileName","lineNumber","columnNumber","onClose","doctorName","onSubmit","value","onChange","target","placeholder","rows","required","type","disabled","background","padding","borderRadius","border","cursor","fontSize","fontWeight","onMouseEnter","currentTarget","onMouseLeave","onClick","length","filter","test","toLowerCase","includes","map","index","requestDate","description","createdDate","firstName","lastName","bloodType","dateOfBirth","cost","result","resultId","href","_c","$RefreshReg$"],"sources":["C:/Users/User/Downloads/medora5/frontend/src/pages/lab-tests/LabTestList.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { patientService } from '../../services/patientService';\nimport { labService } from '../../services/labService';\nimport ErrorAlert from '../../components/ErrorAlert';\n\nfunction LabTestList() {\n const [user, setUser] = useState({});\n const isLabTechnician = user.role === 'LAB_TECHNICIAN';\n\n const [patient, setPatient] = useState(null);\n const [embg, setEmbg] = useState('');\n const [searched, setSearched] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const [availableTests, setAvailableTests] = useState([]);\n const [labTestRequests, setLabTestRequests] = useState([]);\n const [labResults, setLabResults] = useState([]);\n const [pendingTests, setPendingTests] = useState([]);\n const [submittedTests, setSubmittedTests] = useState([]);\n const [selectedTest, setSelectedTest] = useState(null);\n\n const [showRequestForm, setShowRequestForm] = useState(false);\n const [requestData, setRequestData] = useState({\n testId: '',\n testDate: new Date().toISOString().split('T')[0],\n notes: '',\n });\n\n const [submitFormData, setSubmitFormData] = useState({\n results: '',\n resultDate: new Date().toISOString().split('T')[0],\n });\n\n // Filter states for pending tests\n const [pendingFilters, setPendingFilters] = useState({\n testName: '',\n patientName: '',\n testDate: '',\n });\n\n // Filter states for submitted tests\n const [submittedFilters, setSubmittedFilters] = useState({\n testName: '',\n patientName: '',\n testDate: '',\n });\n\n // Load user from localStorage and listen for changes\n useEffect(() => {\n const loadUser = () => {\n const userStr = localStorage.getItem('user');\n console.log('[LabTestList] Loading user from localStorage:', userStr);\n if (userStr) {\n try {\n const parsedUser = JSON.parse(userStr);\n console.log('[LabTestList] Parsed user:', parsedUser);\n setUser(parsedUser);\n } catch (err) {\n console.error('Failed to parse user:', err);\n setUser({});\n }\n } else {\n console.log('[LabTestList] No user in localStorage');\n setUser({});\n }\n };\n\n console.log('[LabTestList] useEffect running - loading user');\n loadUser();\n\n // Listen for storage changes (other tabs/windows)\n window.addEventListener('storage', loadUser);\n\n // Listen for custom event (same tab changes)\n window.addEventListener('userStorageChange', loadUser);\n\n return () => {\n window.removeEventListener('storage', loadUser);\n window.removeEventListener('userStorageChange', loadUser);\n };\n }, []);\n\n useEffect(() => {\n if (isLabTechnician) {\n loadLabTestsData();\n }\n }, [isLabTechnician]);\n\n const loadLabTestsData = async () => {\n try {\n setLoading(true);\n setError(null);\n\n // Load pending tests\n const pendingRes = await labService.getPendingLabTests();\n setPendingTests(pendingRes.data || []);\n\n // Try to load submitted tests, but don't fail if this endpoint doesn't exist\n try {\n const submittedRes = await labService.getAllSubmittedLabResults();\n setSubmittedTests(submittedRes.data || []);\n } catch (err) {\n console.warn('Could not load submitted tests:', err);\n setSubmittedTests([]);\n }\n } catch (err) {\n setError('Failed to load pending lab tests');\n setPendingTests([]);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSearch = async (e) => {\n e.preventDefault();\n setError(null);\n setLoading(true);\n\n try {\n if (!embg.trim()) {\n setError('Please enter an EMBG');\n setLoading(false);\n return;\n }\n\n const patientResponse = await patientService.getPatientByEmbg(embg);\n setPatient(patientResponse.data);\n setSearched(true);\n\n // Fetch available tests\n const testsResponse = await labService.getAllLabTests();\n setAvailableTests(testsResponse.data);\n\n // Fetch medical record for patient\n const { medicalRecordService } = await import('../../services/medicalRecordService');\n const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(patientResponse.data.patientId);\n\n // Fetch existing test requests for patient\n const requestsResponse = await labService.getLabTestRequestsForPatient(patientResponse.data.patientId);\n setLabTestRequests(requestsResponse.data);\n\n // Fetch lab results for medical record\n const resultsResponse = await labService.getLabResultsForMedicalRecord(medicalRecordRes.data.recordId);\n setLabResults(resultsResponse.data);\n } catch (err) {\n setError(`Patient with EMBG ${embg} not found`);\n setPatient(null);\n } finally {\n setLoading(false);\n }\n };\n\n const handleRequestTest = async (e) => {\n e.preventDefault();\n setError(null);\n\n if (!requestData.testId) {\n setError('Please select a test');\n return;\n }\n\n if (!patient) {\n setError('Patient not found');\n return;\n }\n\n try {\n setLoading(true);\n\n // Get doctor ID from logged-in user\n const doctorId = user.doctorId;\n\n const request = {\n patientId: patient.patientId,\n medicalRecordId: patient.patientId, // Assuming medical record ID matches patient ID\n doctorId: parseInt(doctorId),\n testId: parseInt(requestData.testId),\n testDate: requestData.testDate,\n notes: requestData.notes,\n };\n\n console.log('User object:', user);\n console.log('Sending lab test request with doctorId:', doctorId, 'Full request:', request);\n\n await labService.requestLabTest(request);\n\n // Refresh the test requests\n const requestsResponse = await labService.getLabTestRequestsForPatient(patient.patientId);\n setLabTestRequests(requestsResponse.data);\n\n // Reset form\n setRequestData({\n testId: '',\n testDate: new Date().toISOString().split('T')[0],\n notes: '',\n });\n setShowRequestForm(false);\n setError(null);\n } catch (err) {\n setError('Failed to request lab test: ' + err.response?.data?.error || err.message);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSubmitResult = async (e) => {\n e.preventDefault();\n setError(null);\n\n if (!submitFormData.results.trim()) {\n setError('Please enter test results');\n return;\n }\n\n if (!selectedTest) {\n setError('No test selected');\n return;\n }\n\n try {\n setLoading(true);\n\n const { medicalRecordService } = await import('../../services/medicalRecordService');\n const medicalRecordRes = await medicalRecordService.getMedicalRecordByPatientId(selectedTest.patientId);\n\n const resultData = {\n medicalRecordId: medicalRecordRes.data.recordId,\n testId: selectedTest.testId,\n results: submitFormData.results,\n resultDate: submitFormData.resultDate,\n };\n\n await labService.submitLabResult(resultData);\n\n // Refresh pending tests\n await loadLabTestsData();\n\n // Reset form\n setSelectedTest(null);\n setSubmitFormData({\n results: '',\n resultDate: new Date().toISOString().split('T')[0],\n });\n\n // Show success message\n setError(null);\n alert('Lab result submitted successfully!');\n\n // Refresh the lab tests data\n await loadLabTestsData();\n\n // Reset form\n setSelectedTest(null);\n setSubmitFormData({\n results: '',\n resultDate: new Date().toISOString().split('T')[0],\n });\n } catch (err) {\n setError('Failed to submit lab result: ' + (err.response?.data?.error || err.message));\n } finally {\n setLoading(false);\n }\n };\n\n if (isLabTechnician) {\n return (\n
Test: {selectedTest.testName}
\nPatient: {selectedTest.patientName}
\nDoctor: {selectedTest.doctorName}
\nTest Date: {selectedTest.testDate}
\n {selectedTest.notes &&Notes: {selectedTest.notes}
}\n| Test | \nPatient | \nDoctor | \nRequested | \nTest Date | \nNotes | \nAction | \n
|---|---|---|---|---|---|---|
| {test.testName} | \n{test.patientName} | \n{test.doctorName} | \n{test.requestDate} | \n{test.testDate} | \n{test.notes || '-'} | \n\n \n | \n
| Test | \nPatient | \nTest Date | \nResult Date | \nStatus | \n
|---|---|---|---|---|
| {test.testName || test.description || 'Lab Test'} | \n{test.patientName || 'N/A'} | \n{test.testDate || 'N/A'} | \n{test.resultDate || test.createdDate || 'N/A'} | \n\n \n Submitted\n \n | \n
EMBG
\n{patient.embg}
\nBlood Type
\n{patient.bloodType || 'N/A'}
\nDate of Birth
\n{patient.dateOfBirth}
\n{request.testName}
\nRequested by: {request.doctorName}
\nTest Date: {request.requestDate}
\n {request.notes && (\nNotes: {request.notes}
\n )}\n{result.testName}
\nResults: {result.results}
\nResult Date: {result.resultDate}
\n\n {labTestRequests.length} test{labTestRequests.length !== 1 ? 's' : ''} awaiting results\n
\n \n Submit Lab Results\n \nNo lab test requests for this patient
\nEnter a patient EMBG to request lab tests
\n