ohif-viewer/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx

130 lines
4.0 KiB
TypeScript
Raw Normal View History

import React from 'react';
2020-05-26 15:03:58 +02:00
import PropTypes from 'prop-types';
import { useSystem } from '@ohif/core';
import PanelStudyBrowser from '@ohif/extension-default/src/Panels/StudyBrowser/PanelStudyBrowser';
import { UntrackSeriesModal } from './untrackSeriesModal';
import { useTrackedMeasurements } from '../../getContextModule';
2024-11-06 13:15:27 +01:00
const thumbnailNoImageModalities = [
'SR',
'SEG',
'SM',
'RTSTRUCT',
'RTPLAN',
'RTDOSE',
'DOC',
'OT',
'PMAP',
];
2020-05-26 15:03:58 +02:00
/**
* Panel component for the Study Browser with tracking capabilities
2020-05-26 15:03:58 +02:00
*/
export default function PanelStudyBrowserTracking({
2020-05-26 15:03:58 +02:00
getImageSrc,
getStudiesForPatientByMRN,
2020-05-26 15:03:58 +02:00
requestDisplaySetCreationForStudy,
dataSource,
}) {
const { servicesManager } = useSystem();
const { displaySetService, uiModalService, measurementService } = servicesManager.services;
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
const { trackedSeries } = trackedMeasurements.context;
const onClickUntrack = displaySetInstanceUID => {
const onConfirm = () => {
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
sendTrackedMeasurementsEvent('UNTRACK_SERIES', {
SeriesInstanceUID: displaySet.SeriesInstanceUID,
});
const measurements = measurementService.getMeasurements();
measurements.forEach(m => {
if (m.referenceSeriesUID === displaySet.SeriesInstanceUID) {
measurementService.remove(m.uid);
}
});
};
uiModalService.show({
title: 'Untrack Series',
content: UntrackSeriesModal,
contentProps: {
onConfirm,
},
});
};
// Custom mapping function to add tracking data to display sets
const mapDisplaySetsWithTracking = (
displaySets,
displaySetLoadingState,
thumbnailImageSrcMap,
viewports
) => {
const thumbnailDisplaySets = [];
const thumbnailNoImageDisplaySets = [];
displaySets
.filter(ds => !ds.excludeFromThumbnailBrowser)
.forEach(ds => {
const { thumbnailSrc, displaySetInstanceUID } = ds;
const componentType = getComponentType(ds);
const array =
componentType === 'thumbnailTracked' ? thumbnailDisplaySets : thumbnailNoImageDisplaySets;
const loadingProgress = displaySetLoadingState?.[displaySetInstanceUID];
array.push({
displaySetInstanceUID,
description: ds.SeriesDescription || '',
seriesNumber: ds.SeriesNumber,
modality: ds.Modality,
seriesDate: ds.SeriesDate ? new Date(ds.SeriesDate).toLocaleDateString() : '',
numInstances: ds.numImageFrames,
loadingProgress,
countIcon: ds.countIcon,
messages: ds.messages,
StudyInstanceUID: ds.StudyInstanceUID,
componentType,
imageSrc: thumbnailSrc || thumbnailImageSrcMap[displaySetInstanceUID],
dragData: {
type: 'displayset',
displaySetInstanceUID,
},
isTracked: trackedSeries.includes(ds.SeriesInstanceUID),
isHydratedForDerivedDisplaySet: ds.isHydrated,
});
});
return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];
};
// Override component type to use tracking specific components
const getComponentType = ds => {
if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
return 'thumbnailNoImage';
}
return 'thumbnailTracked';
};
return (
<PanelStudyBrowser
getImageSrc={getImageSrc}
getStudiesForPatientByMRN={getStudiesForPatientByMRN}
requestDisplaySetCreationForStudy={requestDisplaySetCreationForStudy}
dataSource={dataSource}
customMapDisplaySets={mapDisplaySetsWithTracking}
onClickUntrack={onClickUntrack}
/>
2020-05-26 15:03:58 +02:00
);
}
PanelStudyBrowserTracking.propTypes = {
2020-05-26 15:03:58 +02:00
dataSource: PropTypes.shape({
getImageIdsForDisplaySet: PropTypes.func.isRequired,
}).isRequired,
getImageSrc: PropTypes.func.isRequired,
getStudiesForPatientByMRN: PropTypes.func.isRequired,
2020-05-26 15:03:58 +02:00
requestDisplaySetCreationForStudy: PropTypes.func.isRequired,
};