import React, { useMemo } from 'react'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { DataTable, DataTableSkeleton, SkeletonText, Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, TableRow, } from '@carbon/react'; import { type Order, type OBSERVATION_INTERPRETATION, ReferenceRangeDisplay, useReferenceRanges, } from '@openmrs/esm-patient-common-lib'; import { useLabEncounter, useOrderConceptByUuid } from '../../lab-results.resource'; import { getConceptUuids, getEffectiveRanges, getInterpretationClass, interpretObservation } from '../../../utils'; import styles from './print-preview.scss'; interface PrintableReportProps { order: Order; index: number; } const PrintableReport: React.FC = ({ order, index }) => { const { t } = useTranslation(); const { concept, isLoading: isLoadingTestConcepts } = useOrderConceptByUuid(order?.concept?.uuid); const { encounter, isLoading: isLoadingResult } = useLabEncounter(order?.encounter?.uuid); const patientUuid = encounter?.patient?.uuid; const conceptUuids = useMemo(() => getConceptUuids(concept), [concept]); const { ranges: referenceRanges, isLoading: isLoadingRanges } = useReferenceRanges(patientUuid, conceptUuids); const tableHeaders = useMemo( () => [ { key: 'testType', header: order?.orderType?.display || t('test', 'Test'), }, { key: 'result', header: t('result', 'Result'), }, { key: 'normalRange', header: t('referenceRange', 'Reference range'), }, ], [t, order?.orderType?.display], ); const testResultObs = useMemo(() => { if (!encounter || !concept) return null; return encounter.obs?.find((obs) => obs.concept.uuid === concept.uuid); }, [concept, encounter]); const testRows = useMemo(() => { if (!concept || !encounter) { return []; } if (concept.setMembers?.length > 0) { return concept.setMembers.map((memberConcept) => { const memberObs = testResultObs?.groupMembers?.find((obs) => obs?.concept?.uuid === memberConcept?.uuid); const ranges = getEffectiveRanges(memberConcept, referenceRanges); let result: { value: string; interpretation: OBSERVATION_INTERPRETATION } | React.ReactNode; if (isLoadingResult) { result = ; } else if (memberObs) { const { displayValue, interpretation } = interpretObservation(memberObs, ranges); result = { value: displayValue, interpretation }; } else { result = '--'; } return { id: memberObs?.uuid ?? `${testResultObs?.uuid}:${memberConcept?.uuid}`, testType:
{memberConcept?.display || '--'}
, result, normalRange: , }; }); } const ranges = getEffectiveRanges(concept, referenceRanges); let result: { value: string; interpretation: OBSERVATION_INTERPRETATION } | React.ReactNode; if (isLoadingResult) { result = ; } else if (testResultObs) { const { displayValue, interpretation } = interpretObservation(testResultObs, ranges); result = { value: displayValue, interpretation }; } else { result = '--'; } return [ { id: testResultObs?.uuid ?? concept.uuid, testType:
{concept.display || '--'}
, result, normalRange: , }, ]; }, [concept, encounter, isLoadingResult, testResultObs, referenceRanges]); if (isLoadingTestConcepts || isLoadingResult || isLoadingRanges) { return ; } if (!concept) { return
{t('noTestData', 'No test data available')}
; } return (

{index + 1}. {order.concept.display} — {order.orderNumber}

{({ rows, headers, getHeaderProps, getRowProps, getTableProps, getTableContainerProps }) => ( {headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => cell.value?.interpretation ? ( {cell.value.value} ) : ( {cell.value} ), )} ))}
)}
); }; export default PrintableReport;