import { useState, useContext, useMemo, useEffect } from 'react'; // Context import { AppContext } from '../App'; // Router import { useNavigate } from 'react-router-dom'; // Cloudscape import { CollectionPreferences } from '@cloudscape-design/components'; import { Button, ColumnLayout, DateRangePicker, Form, Header, Input, SpaceBetween, } from '@cloudscape-design/components'; // App import SelectDatastore from '../../common/SelectDatastore'; import { formatSearchParams } from './searchUtils'; import { collectionPreferencesProps } from './tablePrefs'; import { datePickerRelativeOptions, DATE_PICKER_I18N } from './tableDateRangePickerOpts'; /** * Table preferences */ export function TablePreferences({ preferences, setPreferences }) { return ( setPreferences(detail)} /> ); } /** * Table header functional components */ function TableHeaderActions({ selectedDatastore, setSelectedDatastore, selectedImageSet, actionButtonDisabled }) { const { datastoreLoadStatus, getDatastores } = useContext(AppContext); const navigate = useNavigate(); function handleViewMetadataClick() { if (selectedImageSet.length === 0) return; const url = `/metadata?datastoreId=${selectedDatastore.value}&imageSetId=${selectedImageSet?.[0]?.imageSetId}`; navigate(url); } function handleViewImageClick() { if (selectedImageSet.length === 0) return; const url = `/viewer?datastoreId=${selectedDatastore.value}&imageSetId=${selectedImageSet?.[0]?.imageSetId}`; navigate(url); } return ( ); } /** * Table header */ export function TableHeader({ selectedDatastore, setSelectedDatastore, selectedImageSet, actionButtonDisabled, headerCounterText, searchImageSets, }) { const [searchParams, setSearchParams] = useState({}); // Disable search ImageSets if there's no datastore selected const searchImageSetsDisabled = useMemo( () => (selectedDatastore?.value ? false : true), [selectedDatastore?.value] ); // Search all on datastore change (and initial page load) useEffect(() => { if (selectedDatastore) { searchImageSets(formatSearchParams(searchParams)); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchImageSets, selectedDatastore]); // Disable input if one field has a value function isInputDisabled(id) { // If there are search params AND this is the id that has a value // OR there are no search params, input is not disabled if ((id in searchParams && Object.keys(searchParams)).length > 0 || Object.keys(searchParams).length === 0) { return false; } else { return true; } } // Update searchParam to id: value function handleInputChange(id, value) { if (value) { setSearchParams((currentSearchParams) => { const newSearchParams = { ...currentSearchParams, [id]: value, }; return newSearchParams; }); } else { setSearchParams((currentSearchParams) => { const newSearchParams = { ...currentSearchParams }; delete newSearchParams[id]; return newSearchParams; }); } } return ( <>
} > Search
e.preventDefault()}> } > handleInputChange('patientId', e.detail.value)} /> handleInputChange('accessionNumber', e.detail.value)} /> handleInputChange('studyId', e.detail.value)} /> handleInputChange('studyUid', e.detail.value)} /> handleInputChange('studyDate', e.detail.value)} relativeOptions={datePickerRelativeOptions} i18nStrings={DATE_PICKER_I18N} />
); }