import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, DataTable, DataTableSkeleton, Pagination, Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, TableRow, TableToolbar, TableToolbarContent, TableToolbarSearch, } from '@carbon/react'; import { Download } from '@carbon/react/icons'; import { ConfigurableLink, useConfig, usePagination } from '@openmrs/esm-framework'; import { useUnscheduledAppointments } from '../../hooks/useUnscheduledAppointments'; import { exportUnscheduledAppointmentsToSpreadsheet } from '../../helpers/excel'; import { EmptyState } from '../../empty-state/empty-state.component'; import { getPageSizes, useSearchResults, filterUnscheduledAppointmentsByServiceType } from '../utils'; import { type ConfigObject } from '../../config-schema'; interface UnscheduledAppointmentsProps { appointmentServiceTypes?: Array; } const UnscheduledAppointments: React.FC = ({ appointmentServiceTypes }) => { const { t } = useTranslation(); const [pageSize, setPageSize] = useState(25); const [searchString, setSearchString] = useState(''); const { data: unscheduledAppointments, isLoading, error } = useUnscheduledAppointments(); const filteredAppointments = filterUnscheduledAppointmentsByServiceType( unscheduledAppointments || [], appointmentServiceTypes || [], ); const searchResults = useSearchResults(filteredAppointments, searchString); const { customPatientChartUrl } = useConfig(); const headerData = [ { header: t('patientName', 'Patient Name'), key: 'name', }, { header: t('identifier', 'Identifier'), key: 'identifier', }, { header: t('gender', 'Gender'), key: 'gender', }, { header: t('phoneNumber', 'Phone Number'), key: 'phoneNumber', }, { header: t('service', 'Service'), key: 'service', }, ]; const { results, currentPage, goTo } = usePagination(searchResults, pageSize); const rowData = results?.map((appointment) => { const patientDisplay = appointment.patient?.display || ''; const [identifier, ...nameParts] = patientDisplay.split(' - '); const patientName = nameParts.join(' - ') || 'Unknown Patient'; return { id: `${appointment.appointmentId}`, name: ( {patientName} ), gender: 'Unknown', phoneNumber: '--', identifier: identifier || '--', service: appointment.service?.name || t('noService', 'No service assigned'), }; }) || []; if (isLoading) { return ; } if (error) { return (
Error loading appointments: {error.message || 'Unknown error'}
); } if (!unscheduledAppointments?.length) { return ( ); } if (!filteredAppointments?.length && appointmentServiceTypes?.length) { return (
Filter Info:
Total unscheduled appointments: {unscheduledAppointments?.length || 0}
After service filtering: {filteredAppointments?.length || 0}
Selected filters: {appointmentServiceTypes?.join(', ') || 'None'}
); } return (
{({ rows, headers, getHeaderProps, getTableProps }) => ( setSearchString(event.target.value)} placeholder={t('searchAppointments', 'Search appointments...')} /> {headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => ( {cell.value} ))} ))}
)}
{ goTo(page); setPageSize(newPageSize); }} pageSizes={getPageSizes(filteredAppointments, pageSize) ?? []} totalItems={filteredAppointments.length ?? 0} />
); }; export default UnscheduledAppointments;