import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { InputDialog } from '@ohif/ui-next'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ohif/ui-next'; import { useSystem } from '@ohif/core'; type DataSource = { value: string; label: string; placeHolder: string; }; type ReportDialogProps = { dataSources: DataSource[]; modality?: string; predecessorImageId?: string; hide: () => void; onSave: (data: { reportName: string; dataSource: string | null; series: string | null; priorSeriesNumber: number; }) => void; onCancel: () => void; }; function ReportDialog({ dataSources, modality = 'SR', predecessorImageId, minSeriesNumber = 3000, hide, onSave, onCancel, }: ReportDialogProps) { const { servicesManager } = useSystem(); const [selectedDataSource, setSelectedDataSource] = useState( dataSources?.[0]?.value ?? null ); const { displaySetService } = servicesManager.services; const [selectedSeries, setSelectedSeries] = useState(predecessorImageId || null); const [reportName, setReportName] = useState(''); const seriesOptions = useMemo(() => { const displaySetsMap = displaySetService.getDisplaySetCache(); const displaySets = Array.from(displaySetsMap.values()); const options = displaySets .filter(ds => ds.Modality === modality) .map(ds => ({ value: ds.predecessorImageId || ds.SeriesInstanceUID, seriesNumber: isFinite(ds.SeriesNumber) ? ds.SeriesNumber : minSeriesNumber, description: ds.SeriesDescription, label: `${ds.SeriesDescription} ${ds.SeriesDate}/${ds.SeriesTime} ${ds.SeriesNumber}`, })); return [ { value: null, description: null, seriesNumber: minSeriesNumber, label: 'Create new series', }, ...options, ]; }, [displaySetService, modality]); useEffect(() => { const seriesOption = seriesOptions.find(s => s.value === selectedSeries); const newReportName = selectedSeries && seriesOption?.description ? seriesOption.description : ''; setReportName(newReportName); }, [selectedSeries, seriesOptions]); const handleSave = useCallback(() => { onSave({ reportName, dataSource: selectedDataSource, priorSeriesNumber: Math.max(...seriesOptions.map(it => it.seriesNumber)), series: selectedSeries, }); hide(); }, [selectedDataSource, selectedSeries, reportName, hide, onSave]); const handleCancel = useCallback(() => { onCancel(); hide(); }, [onCancel, hide]); const showDataSourceSelect = dataSources?.length > 1; return (
{showDataSourceSelect && ( <>
Data source
Series
)}
{!showDataSourceSelect && (
Series
)}
Cancel Save
); } export { ReportDialog }; export default { 'ohif.createReportDialog': ReportDialog, };