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;