import React, { ChangeEvent, useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { DataTable, TableContainer, TableToolbar, TableToolbarContent, Table, TableHead, TableRow, TableHeader, TableBody, TableCell, TableToolbarSearch, Button, DataTableSkeleton, Pagination, } from '@carbon/react'; import { Add, Renew } from '@carbon/react/icons'; import { ErrorState, formatDatetime, parseDate, useDebounce, useLayoutType } from '@openmrs/esm-framework'; import { EmptyState, useLaunchWorkspaceRequiringVisit, usePaginationInfo } from '@openmrs/esm-patient-common-lib'; import capitalize from 'lodash-es/capitalize'; import { usePharmacyOrders } from './pharmacy-orders.resource'; import styles from './pharmacy-orders.scss'; type PharmacyOrdersProps = { patient: fhir.Patient; }; const PharmacyOrders: React.FC = ({ patient }) => { const { t } = useTranslation(); const responseSize = useLayoutType() === 'tablet' ? 'md' : 'sm'; const [searchTerm, setSearchTerm] = useState(''); const debouncedSearchTerm = useDebounce(searchTerm, 500); const { medicationRequests, isLoading, error, mutate, currentPage, goTo, totalCount, currPageSize, setCurrPageSize } = usePharmacyOrders(patient.identifier[0]?.value ?? '', debouncedSearchTerm); const launchAddDrugOrder = useLaunchWorkspaceRequiringVisit('add-drug-order'); const currentItems = useMemo(() => { return medicationRequests.length; }, [medicationRequests]); const { pageSizes, itemsDisplayed } = usePaginationInfo( currPageSize, totalCount || 0, currentPage || 1, currentItems, ); const header = [ { key: 'date', header: t('dateAndTime', 'Date and time') }, { key: 'medication', header: t('medication', 'Medication') }, { key: 'quantity', header: t('quantity', 'Quantity') }, { key: 'requester', header: t('requester', 'Requester') }, { key: 'status', header: t('status', 'Status') }, ]; const rows = medicationRequests.map((medicationRequest) => { const resource = medicationRequest.resource as fhir.MedicationRequest; return { id: medicationRequest.fullUrl, date: formatDatetime(parseDate(resource?.authoredOn), { mode: 'standard', noToday: true }), medication: resource?.medicationReference?.display, quantity: resource?.dispenseRequest?.quantity?.value, requester: (resource?.requester as fhir.Reference)?.display, status: capitalize(resource?.status), }; }); if (isLoading) { return (
); } if (error) { return (
); } if (rows.length === 0 && !isLoading) { return (
); } return (
{({ rows, headers, getHeaderProps, getTableProps, getToolbarProps }) => ( ) => setSearchTerm(evt.target.value)} placeholder={t('searchMedicationOrders', 'Search medication orders')} value={searchTerm} /> {headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => ( {cell.value} ))} ))}
{totalCount > 0 && ( { if (pageSize !== currPageSize) { setCurrPageSize(pageSize); } goTo(page); }} size={responseSize} /> )}
)}
); }; export default PharmacyOrders;