import React, { useEffect, useMemo, useState } from 'react'; import { DataTableSkeleton, Dropdown, Layer, TableToolbarSearch } from '@carbon/react'; import { useTranslation } from 'react-i18next'; import { isDesktop, showSnackbar, useLayoutType } from '@openmrs/esm-framework'; import { updateSelectedQueueStatus, useServiceQueuesStore } from '../store/store'; import { useColumns } from './cells/columns.resource'; import { useQueueEntries } from '../hooks/useQueueEntries'; import useQueueStatuses from '../hooks/useQueueStatuses'; import AddPatientToQueueButton from './components/add-patient-to-queue-button.component'; import ClearQueueEntries from '../modals/clear-queue-entries-modal/clear-queue-entries.component'; import QueueTable from './queue-table.component'; import QueueTableExpandedRow from './queue-table-expanded-row.component'; import styles from './queue-table.scss'; function DefaultQueueTable() { const { t } = useTranslation(); const layout = useLayoutType(); return (

{t('patientsCurrentlyInQueue', 'Patients currently in queue')}

); } function QueueTableSection() { const { t } = useTranslation(); const layout = useLayoutType(); const { selectedServiceUuid, selectedQueueLocationUuid, selectedQueueStatusUuid } = useServiceQueuesStore(); const [searchTerm, setSearchTerm] = useState(''); const searchCriteria = useMemo(() => { return { service: selectedServiceUuid, location: selectedQueueLocationUuid, isEnded: false, status: selectedQueueStatusUuid, }; }, [selectedServiceUuid, selectedQueueLocationUuid, selectedQueueStatusUuid]); const { queueEntries, isLoading, error, isValidating } = useQueueEntries(searchCriteria); useEffect(() => { if (error?.message) { showSnackbar({ title: t('errorLoadingQueueEntries', 'Error loading queue entries'), kind: 'error', subtitle: error?.message, }); } }, [error?.message, t]); const columns = useColumns(null, null); useEffect(() => { if (!columns) { showSnackbar({ kind: 'warning', title: t('notableConfig', 'No table configuration'), subtitle: 'No table configuration defined for queue: null and status: null', }); } }, [columns, t]); const filteredQueueEntries = useMemo(() => { const searchTermLowercase = searchTerm.toLowerCase(); return queueEntries?.filter((queueEntry) => { return columns?.some((column) => { const columnSearchTerm = column.getFilterableValue?.(queueEntry)?.toLocaleLowerCase(); return columnSearchTerm?.includes(searchTermLowercase); }); }); }, [columns, queueEntries, searchTerm]); if (isLoading) { return ; } return ( {filteredQueueEntries?.length > 0 && } { if (typeof e === 'string') { setSearchTerm(e); } else if (e && 'target' in e) { const target = e.target as HTMLInputElement; setSearchTerm(target.value); } }} placeholder={t('searchThisList', 'Search this list')} size={isDesktop(layout) ? 'sm' : 'lg'} persistent /> } /> ); } function StatusDropdownFilter() { const { t } = useTranslation(); const layout = useLayoutType(); const { statuses } = useQueueStatuses(); const { selectedQueueStatusDisplay } = useServiceQueuesStore(); const handleStatusChange = ({ selectedItem }) => { updateSelectedQueueStatus(selectedItem.uuid, selectedItem?.display); }; return (
(item ? item.display : '')} label={selectedQueueStatusDisplay ?? t('all', 'All')} onChange={handleStatusChange} size={isDesktop(layout) ? 'sm' : 'lg'} titleText={t('showPatientsWithStatus', 'Show patients with status:')} type="inline" />
); } export default DefaultQueueTable;