import React, { useCallback, useEffect, useState } from "react"; import { DataTable, Table, TableContainer, TableHead, TableRow, TableHeader, TableBody, TableCell, Pagination, DataTableSkeleton, Search, Layer, InlineLoading, Tile, } from "@carbon/react"; import styles from "./patient-list.scss"; import { useTranslation } from "react-i18next"; import { EmptyState } from "@openmrs/esm-patient-common-lib"; import { navigate } from "@openmrs/esm-framework"; // eslint-disable-next-line no-restricted-imports import { debounce } from "lodash"; import { usePatientList } from "../../hooks/usePatientList"; export interface PatientListProps { title: string; headerData: Array<{ header: string; key: string }>; rowData: Array<{}>; } export const PatientList: React.FC = () => { const { t } = useTranslation(); const [nextOffSet, setNextOffSet] = useState(0); const [pageSize, setPageSize] = useState(10); const [searchTerm, setSearchTerm] = useState(""); const { patients, error, isLoading, total } = usePatientList( nextOffSet, pageSize, searchTerm ); const [page, setPage] = useState(1); const [totalPatientCount, setPatientCount] = useState(0); useEffect(() => { // Carbon's pagination component supports a max of 10,000 items // see: https://github.com/carbon-design-system/carbon/issues/6836 setPatientCount(total <= 10000 ? total : 10000); }, [total]); const onSearchQueryChange = debounce((val) => { setSearchTerm(val); }, 300); const handleClear = useCallback(() => setSearchTerm(""), [setSearchTerm]); const headerData = [ { key: "patientLink", header: t("name", "Name"), }, { key: "gender", header: t("gender", "Gender"), }, { key: "age", header: t("age", "Age"), }, { key: "actions", header: "", }, ]; const displayTitle = t("patientList", "Patient List"); const addNewPatient = () => navigate({ to: "${openmrsSpaBase}/patient-registration" }); return (
{isLoading && !searchTerm ? ( ) : patients?.length > 0 ? (

{displayTitle}

{isLoading && searchTerm && }
onSearchQueryChange(event.target.value)} onClear={handleClear} />
{({ rows, headers, getHeaderProps, getTableProps }) => (
{headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => ( {cell.value} ))} ))}
{ setPage(page); setNextOffSet((page - 1) * pageSize); setPageSize(pageSize); }} />
)}
) : ( )}
); };