import React, { type ChangeEvent, useId, useMemo, useState } from 'react'; import fuzzy from 'fuzzy'; import { useTranslation } from 'react-i18next'; import { DataTable, DataTableSkeleton, Layer, Search, Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, TableRow, Tile, } from '@carbon/react'; import { useLayoutType, isDesktop, ConfigurableLink } from '@openmrs/esm-framework'; import { EmptyDataIllustration } from '@openmrs/esm-patient-common-lib'; import { type MappedListMembers } from '../patient-lists.resource'; import styles from './patient-list-details-table.scss'; interface PatientListDetailsTableProps { isLoading: boolean; listMembers: Array; } const PatientListDetailsTable: React.FC = ({ listMembers, isLoading }) => { const { t } = useTranslation(); const id = useId(); const layout = useLayoutType(); const responsiveSize = isDesktop(layout) ? 'sm' : 'lg'; const [searchTerm, setSearchTerm] = useState(''); const tableHeaders = useMemo( () => [ { key: 'name', header: t('name', 'Name'), }, { key: 'identifier', header: t('identifier', 'Identifier'), }, { key: 'sex', header: t('sex', 'Sex'), }, { key: 'startDate', header: t('startDate', 'Start date'), }, ], [t], ); const filteredListMembers = useMemo(() => { if (!searchTerm) { return listMembers; } return fuzzy .filter(searchTerm, listMembers, { extract: (member) => `${member.name} ${member.identifier} ${member.sex}`, }) .sort((r1, r2) => r1.score - r2.score) .map((result) => result.original); }, [searchTerm, listMembers]); const tableRows = useMemo( () => filteredListMembers?.map((member) => ({ id: member.patientUuid, ...member, })) ?? [], [filteredListMembers], ); const handleSearchTermChange = (e: ChangeEvent) => setSearchTerm(e.target.value); if (isLoading) { return (
); } if (listMembers?.length > 0) { return (
<> {({ rows, headers, getHeaderProps, getTableProps, getRowProps }) => ( {headers.map((header) => ( {header.header} ))} {rows.map((row) => { const currentPatient = listMembers.find((member) => member.patientUuid === row.id); return ( {currentPatient.name} {currentPatient.identifier} {currentPatient.sex} {currentPatient.startDate} ); })}
)}
{filteredListMembers?.length === 0 ? (

{t('noMatchingPatients', 'No matching patients to display')}

{t('checkFilters', 'Check the filters above')}

) : null}
); } return (

{t('noPatientsInList', 'There are no patients in this list')}

); }; export default PatientListDetailsTable;