2025-04-03 00:10:47 +02:00
|
|
|
import React from 'react';
|
2020-05-26 15:03:58 +02:00
|
|
|
import PropTypes from 'prop-types';
|
2025-04-03 00:10:47 +02:00
|
|
|
import { useSystem } from '@ohif/core';
|
|
|
|
|
import PanelStudyBrowser from '@ohif/extension-default/src/Panels/StudyBrowser/PanelStudyBrowser';
|
2025-02-28 21:17:55 +01:00
|
|
|
import { UntrackSeriesModal } from './untrackSeriesModal';
|
2025-04-03 00:10:47 +02:00
|
|
|
import { useTrackedMeasurements } from '../../getContextModule';
|
2025-02-28 21:17:55 +01:00
|
|
|
|
2024-11-06 13:15:27 +01:00
|
|
|
const thumbnailNoImageModalities = [
|
|
|
|
|
'SR',
|
|
|
|
|
'SEG',
|
|
|
|
|
'SM',
|
|
|
|
|
'RTSTRUCT',
|
|
|
|
|
'RTPLAN',
|
|
|
|
|
'RTDOSE',
|
|
|
|
|
'DOC',
|
|
|
|
|
'OT',
|
|
|
|
|
'PMAP',
|
|
|
|
|
];
|
2025-01-13 16:49:08 +01:00
|
|
|
|
2020-05-26 15:03:58 +02:00
|
|
|
/**
|
2025-04-03 00:10:47 +02:00
|
|
|
* Panel component for the Study Browser with tracking capabilities
|
2020-05-26 15:03:58 +02:00
|
|
|
*/
|
2024-11-28 19:22:40 +01:00
|
|
|
export default function PanelStudyBrowserTracking({
|
2020-05-26 15:03:58 +02:00
|
|
|
getImageSrc,
|
2023-05-11 16:01:33 +02:00
|
|
|
getStudiesForPatientByMRN,
|
2020-05-26 15:03:58 +02:00
|
|
|
requestDisplaySetCreationForStudy,
|
|
|
|
|
dataSource,
|
2025-02-19 00:19:09 +01:00
|
|
|
}) {
|
2025-04-03 00:10:47 +02:00
|
|
|
const { servicesManager } = useSystem();
|
|
|
|
|
const { displaySetService, uiModalService, measurementService } = servicesManager.services;
|
2023-09-01 22:19:39 +02:00
|
|
|
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
|
2023-05-11 16:01:33 +02:00
|
|
|
const { trackedSeries } = trackedMeasurements.context;
|
2020-05-27 14:20:54 +02:00
|
|
|
|
2024-04-16 15:01:06 +02:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2025-02-28 21:17:55 +01:00
|
|
|
uiModalService.show({
|
|
|
|
|
title: 'Untrack Series',
|
|
|
|
|
content: UntrackSeriesModal,
|
2024-04-16 15:01:06 +02:00
|
|
|
contentProps: {
|
2025-02-28 21:17:55 +01:00
|
|
|
onConfirm,
|
2024-04-16 15:01:06 +02:00
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-03 00:10:47 +02:00
|
|
|
// 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';
|
|
|
|
|
};
|
2024-10-18 17:42:44 +02:00
|
|
|
|
2025-04-03 00:10:47 +02:00
|
|
|
return (
|
|
|
|
|
<PanelStudyBrowser
|
|
|
|
|
getImageSrc={getImageSrc}
|
|
|
|
|
getStudiesForPatientByMRN={getStudiesForPatientByMRN}
|
|
|
|
|
requestDisplaySetCreationForStudy={requestDisplaySetCreationForStudy}
|
|
|
|
|
dataSource={dataSource}
|
|
|
|
|
customMapDisplaySets={mapDisplaySetsWithTracking}
|
|
|
|
|
onClickUntrack={onClickUntrack}
|
|
|
|
|
/>
|
2020-05-26 15:03:58 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-27 14:20:54 +02:00
|
|
|
PanelStudyBrowserTracking.propTypes = {
|
2020-05-26 15:03:58 +02:00
|
|
|
dataSource: PropTypes.shape({
|
|
|
|
|
getImageIdsForDisplaySet: PropTypes.func.isRequired,
|
|
|
|
|
}).isRequired,
|
|
|
|
|
getImageSrc: PropTypes.func.isRequired,
|
2023-05-11 16:01:33 +02:00
|
|
|
getStudiesForPatientByMRN: PropTypes.func.isRequired,
|
2020-05-26 15:03:58 +02:00
|
|
|
requestDisplaySetCreationForStudy: PropTypes.func.isRequired,
|
|
|
|
|
};
|