import { DataTable, DataTableSkeleton, Layer, OverflowMenu, OverflowMenuItem, Pagination, Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, TableRow, Tile, } from '@carbon/react'; import { ErrorState, formatDate, launchWorkspace, navigate, parseDate, showModal, showSnackbar, useConfig, useLayoutType, usePagination, } from '@openmrs/esm-framework'; import { EmptyDataIllustration, usePaginationInfo } from '@openmrs/esm-patient-common-lib'; import React, { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { LabManifestConfig } from '../config-schema'; import LabManifestTableFilterHeader from '../header/lab-manifest-table-filters-header.component'; import { useLabManifests } from '../hooks'; import { editableManifestStatus, LabManifestFilters, printableManifestStatus, printManifest, resubmittableManifestStatus, } from '../lab-manifest.resources'; import { MappedLabManifest } from '../types'; import styles from './lab-manifest-table.scss'; const LabManifestsTable = () => { const { t } = useTranslation(); const [pageSize, setPageSize] = useState(10); const [currFilter, setCurrFilter] = useState('Draft'); const headerTitle = t('lab Manifest', 'Lab Manifest'); const layout = useLayoutType(); const { manifests, error, isLoading } = useLabManifests(currFilter); const { results, totalPages, currentPage, goTo } = usePagination(manifests, pageSize); const { pageSizes } = usePaginationInfo(pageSize, totalPages, currentPage, results.length); const { labmanifestTypes } = useConfig(); const size = layout === 'tablet' ? 'lg' : 'md'; const headers = useMemo( () => [ { header: t('startDate', 'Start date'), key: 'startDate', isSortable: true, }, { header: t('endDate', 'End date'), key: 'endDate', isSortable: true, }, { header: t('type', 'Type'), key: 'type', isSortable: true, }, { header: t('courrier', 'Courrier'), key: 'courrier', }, { header: t('manifestId', 'Manifest Id'), key: 'manifestId', }, { header: t('labPersonContact', 'Lab person contact'), key: 'labPersonContact', }, { header: t('status', 'Status'), key: 'status', }, { header: t('dispatch', 'Dispatch'), key: 'dispatch', isSortable: true, }, { header: t('samples', 'Samples'), key: 'samples', }, { header: t('actions', 'Actions'), key: 'actions', }, ], [t], ); const handleViewManifestSamples = (manifestUuid: string) => { navigate({ to: window.getOpenmrsSpaBase() + `lab-manifest/detail/${manifestUuid}` }); }; const handleEditManifest = (manifest: MappedLabManifest) => { launchWorkspace('lab-manifest-form', { workspaceTitle: 'Lab Manifest Form', manifest, }); }; const handlePrintManifest = async (manifest: MappedLabManifest, log: boolean = false) => { try { await printManifest(manifest.uuid, log); } catch (error) { showSnackbar({ title: 'Failure', subtitle: 'Error printing manifest', kind: 'error' }); } }; const handleLaunchRequeueConfirmModal = useCallback( (labManifest: MappedLabManifest) => { const dispose = showModal('lab-manifest-requeue-confirm-modal', { labManifest, onClose: () => dispose(), filter: currFilter, }); }, [currFilter], ); const tableRows = useMemo( () => ( results?.map((manifest) => { return { id: `${manifest.uuid}`, startDate: parseDate(manifest.startDate), endDate: manifest.endDate ? parseDate(manifest.endDate) : '--', courrier: manifest.courierName ? manifest.courierName : '--', labPersonContact: manifest.labPersonContact ?? '--', type: labmanifestTypes.find((type) => `${type.id}` === manifest?.manifestType)?.type ?? '--', status: manifest.manifestStatus ?? '--', dispatch: manifest.dispatchDate ? parseDate(manifest.dispatchDate) : '--', manifestId: manifest.manifestId ?? '--', samples: `${manifest.samples.length}`, actions: ( handleViewManifestSamples(manifest.uuid)} /> {editableManifestStatus.includes(manifest.manifestStatus) && ( handleEditManifest(manifest)} /> )} {printableManifestStatus.includes(manifest.manifestStatus) && ( <> handlePrintManifest(manifest)} /> handlePrintManifest(manifest, true)} /> )} {resubmittableManifestStatus.includes(manifest.manifestStatus) && ( handleLaunchRequeueConfirmModal(manifest)} /> )} ), }; }) ?? [] ).sort((a, b) => b.startDate.getTime() - a.startDate.getTime()), [results, handleLaunchRequeueConfirmModal, labmanifestTypes, size, t], ); if (isLoading) { return ; } if (error) { return ; } function customSortRow(cellA, cellB, { sortDirection, sortStates, locale, key, compare }) { // Convert Date objects to timestamps for comparison const valueA = cellA instanceof Date ? cellA.getTime() : cellA; const valueB = cellB instanceof Date ? cellB.getTime() : cellB; if (sortDirection === sortStates.DESC) { return compare(valueB, valueA, locale); } return compare(valueA, valueB, locale); } if (manifests.length === 0) { return (

{t('notLabManifetToDisplay', 'There are no {{status}} lab manifets data to display.', { status: LabManifestFilters.find((lm) => lm.params === currFilter)?.label ?? '', })}

); } return (
( {headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => { const value = cell.value instanceof Date ? formatDate(cell.value) : cell.value; return {value}; })} ))}
)} /> { goTo(page); setPageSize(pageSize); }} />
); }; export default LabManifestsTable;