import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { DataTableSkeleton, Button, Search, Form } from '@carbon/react'; import { CloseIcon, SearchIcon, useLayoutType } from '@openmrs/esm-framework'; import { EmptyState } from '@openmrs/esm-patient-common-lib'; import FilterContext from '../filter/filter-context'; import FilterEmptyState from '../ui-elements/reset-filters-empty-state/filter-empty-state.component'; import LabSetPanel from './lab-set-panel.component'; import Overlay from '../tablet-overlay/tablet-overlay.component'; import TimelineDataGroup from '../grouped-timeline/timeline-data-group.component'; import type { GroupedObservation } from '../../types'; import styles from './individual-results-table-tablet.scss'; interface IndividualResultsTableTabletProps { expanded: boolean; patientUuid: string; } interface IndividualResultsTableTabletHeaderProps { isTablet: boolean; searchTerm: string; setSearchTerm: React.Dispatch>; totalSearchResults: number; } const IndividualResultsTableTablet: React.FC = ({ expanded, patientUuid }) => { const { t } = useTranslation(); const layout = useLayoutType(); const isTablet = layout === 'tablet'; const [searchTerm, setSearchTerm] = useState(''); const [activePanel, setActivePanel] = useState(null); const { tableData, timelineData, lowestParents, isLoading } = useContext(FilterContext); const activeTimelineData = useMemo(() => { return activePanel ? activePanel.entries .map((panelTest) => timelineData.data.rowData.filter((timelineTest) => timelineTest.flatName == panelTest.flatName), ) .flat() : []; }, [timelineData, activePanel]); const activeTimelineParent = useMemo(() => { return activePanel ? lowestParents.find((parent) => parent.display == activePanel.key) : null; }, [lowestParents, activePanel]); const filteredPanels = useMemo(() => { if (!searchTerm) { return tableData; } return tableData?.filter( (panel) => panel.flatName.toLowerCase().includes(searchTerm.toLowerCase()) || panel.entries.some((ob) => ob.display.toLowerCase().includes(searchTerm.toLowerCase())), ); }, [tableData, searchTerm]); useEffect(() => { // Selecting the active panel should not occur in small-desktop if (layout !== 'tablet' && filteredPanels?.length) { setActivePanel(filteredPanels[0]); } }, [filteredPanels, layout]); if (isTablet) { return ( <>
{!isLoading ? ( tableData?.length > 0 ? ( filteredPanels?.length ? ( filteredPanels.map((panel) => ( )) ) : ( setSearchTerm('')} /> ) ) : ( ) ) : ( )}
{activePanel ? ( setActivePanel(null)} headerText={activePanel?.key}>
{}} subRows={activeTimelineData} xScroll={0} />
) : null} ); } return ( <> {!expanded ? (
<> {!isLoading ? ( tableData?.length > 0 ? ( filteredPanels?.length ? ( filteredPanels.map((panel) => ( )) ) : ( setSearchTerm('')} /> ) ) : ( ) ) : ( )}
) : null}
{isLoading ? ( ) : activePanel ? (
{}} />
) : null}
); }; const IndividualResultsTableTabletHeader: React.FC = ({ isTablet, searchTerm, setSearchTerm, totalSearchResults, }) => { const { t } = useTranslation(); const [showSearchFields, setShowSearchFields] = useState(false); const [localSearchTerm, setLocalSearchTerm] = useState(searchTerm); const handleToggleSearchFields = useCallback(() => { setShowSearchFields((prev) => !prev); }, [setShowSearchFields]); const handleSearchTerm = useCallback( (e: React.FormEvent) => { e.preventDefault(); setSearchTerm(localSearchTerm); handleToggleSearchFields(); }, [localSearchTerm, setSearchTerm, handleToggleSearchFields], ); const handleClear = useCallback(() => { setSearchTerm(''); setLocalSearchTerm(''); }, [setSearchTerm, setLocalSearchTerm]); return (
{!showSearchFields ? ( <>
{searchTerm && totalSearchResults > 0 && (

{t('searchResultsTextFor', '{{count}} search results for {{searchTerm}}', { searchTerm, count: totalSearchResults, })}

)} {searchTerm ? ( ) : null}
) : !isTablet ? ( <>
setLocalSearchTerm(e.target.value)} placeholder={t('searchByTestName', 'Search by test name')} size="sm" value={localSearchTerm} /> )}
); }; export default IndividualResultsTableTablet;