Try to do study panel the way react wants

This commit is contained in:
Erik Ziegler 2020-05-15 15:56:57 +02:00
parent 44733b987e
commit 7c0d93f011
2 changed files with 134 additions and 126 deletions

View File

@ -15,12 +15,15 @@ import MeasurementTable from './MeasurementTable.js';
function getImageSrc(imageId, { cornerstone }) { function getImageSrc(imageId, { cornerstone }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
cornerstone.loadAndCacheImage(imageId).then(image => { cornerstone
.loadAndCacheImage(imageId)
.then(image => {
const canvas = document.createElement('canvas'); const canvas = document.createElement('canvas');
cornerstone.renderToCanvas(canvas, image); cornerstone.renderToCanvas(canvas, image);
resolve(canvas.toDataURL()); resolve(canvas.toDataURL());
}); })
.catch(reject);
}); });
} }
@ -33,8 +36,16 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
const updateThumbnailMap = (k, v) => { const updateThumbnailMap = (k, v) => {
setThumbnailImageSrcMap(thumbnailImageSrcMap.set(k, v)); setThumbnailImageSrcMap(thumbnailImageSrcMap.set(k, v));
}; };
const viewportData = []; //useViewportGrid();
const seriesTracking = {}; //useSeriesTracking();
useEffect(() => { useEffect(() => {
if (!viewModel.displaySetInstanceUids.length) {
return;
}
let isSubscribed = true;
const command = commandsManager.getCommand( const command = commandsManager.getCommand(
'getCornerstoneLibraries', 'getCornerstoneLibraries',
'VIEWER' 'VIEWER'
@ -46,41 +57,22 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
const { cornerstone, cornerstoneTools } = command.commandFn(); const { cornerstone, cornerstoneTools } = command.commandFn();
if (!viewModel.displaySetInstanceUids.length) {
return;
}
viewModel.displaySetInstanceUids.forEach(uid => { viewModel.displaySetInstanceUids.forEach(uid => {
const imageIds = dataSource.getImageIdsForDisplaySet(uid); const imageIds = dataSource.getImageIdsForDisplaySet(uid);
const imageId = imageIds[0]; const imageId = imageIds[Math.floor(imageIds.length / 2)];
getImageSrc(imageId, { cornerstone }).then(imageSrc => { getImageSrc(imageId, { cornerstone }).then(imageSrc => {
if (isSubscribed) {
updateThumbnailMap(uid, imageSrc); updateThumbnailMap(uid, imageSrc);
}
}); });
}); });
}, [viewModel.displaySetInstanceUids]);
// TODO
const viewportData = []; //useViewportGrid();
const seriesTracking = {}; //useSeriesTracking();
const displaySets = viewModel.displaySetInstanceUids.map( const displaySets = viewModel.displaySetInstanceUids.map(
displaySetManager.getDisplaySetByUID displaySetManager.getDisplaySetByUID
); );
// TODO: const aDisplaySet = displaySets[0];
// - Put this in something so it only runs once
// - Have update the query update the dicom data store at the study level and then have this component use the data in the view model
useEffect(() => {
if (!viewModel.displaySetInstanceUids.length) {
return;
}
const dSets = viewModel.displaySetInstanceUids.map(
displaySetManager.getDisplaySetByUID
);
const aDisplaySet = dSets[0];
const firstStudy = dicomMetadataStore.getStudy( const firstStudy = dicomMetadataStore.getStudy(
aDisplaySet.StudyInstanceUID aDisplaySet.StudyInstanceUID
); );
@ -103,10 +95,6 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
}; };
}); });
setStudyData(studies);
});
}, [viewModel.displaySetInstanceUids]);
const studiesFromInstanceData = {}; const studiesFromInstanceData = {};
displaySets.forEach(ds => { displaySets.forEach(ds => {
const displaySet = { const displaySet = {
@ -116,7 +104,6 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
modality: ds.Modality, modality: ds.Modality,
date: ds.SeriesDate, date: ds.SeriesDate,
numInstances: ds.numImageFrames, numInstances: ds.numImageFrames,
imageSrc: thumbnailImageSrcMap.get(ds.displaySetInstanceUid),
}; };
const displaySetViewportData = viewportData.find( const displaySetViewportData = viewportData.find(
@ -130,16 +117,15 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
const trackingInfo = seriesTracking[ds.SeriesInstanceUID]; const trackingInfo = seriesTracking[ds.SeriesInstanceUID];
if (trackingInfo) { if (trackingInfo) {
displaySet.isTracked = trackingInfo.isTracked; displaySet.isTracked = trackingInfo.isTracked;
displaySet.componentType = trackingInfo.isTracked
? 'thumbnailTracked'
: 'thumbnail';
} else { } else {
displaySet.isTracked = false; displaySet.isTracked = false;
displaySet.componentType = 'thumbnail';
} }
if (!Object.keys(studiesFromInstanceData).includes(ds.StudyInstanceUID)) { displaySet.componentType = 'thumbnailTracked';
if (
!Object.keys(studiesFromInstanceData).includes(ds.StudyInstanceUID)
) {
const study = dicomMetadataStore.getStudy(ds.StudyInstanceUID); const study = dicomMetadataStore.getStudy(ds.StudyInstanceUID);
const anInstance = study.series[0].instances[0]; const anInstance = study.series[0].instances[0];
@ -152,7 +138,9 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
}; };
} }
studiesFromInstanceData[ds.StudyInstanceUID].displaySets.push(displaySet); studiesFromInstanceData[ds.StudyInstanceUID].displaySets.push(
displaySet
);
studiesFromInstanceData[ds.StudyInstanceUID].numInstances += studiesFromInstanceData[ds.StudyInstanceUID].numInstances +=
displaySet.numInstances; displaySet.numInstances;
@ -168,7 +156,7 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
}); });
// QIDO for all by MRN // QIDO for all by MRN
const allStudies = studyData.map(studyLevelData => { const allStudies = studies.map(studyLevelData => {
const studyFromInstanceData = const studyFromInstanceData =
studiesFromInstanceData[studyLevelData.StudyInstanceUID]; studiesFromInstanceData[studyLevelData.StudyInstanceUID];
@ -187,21 +175,37 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
studyInstanceUid: studyLevelData.StudyInstanceUID, studyInstanceUid: studyLevelData.StudyInstanceUID,
date: studyLevelData.StudyDate || studyFromInstanceData.date, date: studyLevelData.StudyDate || studyFromInstanceData.date,
description: description:
studyLevelData.StudyDescription || studyFromInstanceData.description, studyLevelData.StudyDescription ||
studyFromInstanceData.description,
modalities: modalities:
studyFromInstanceData.modalities || studyLevelData.ModalitiesInStudy, studyFromInstanceData.modalities ||
studyLevelData.ModalitiesInStudy,
numInstances: numInstances:
studyLevelData.NumInstances || studyFromInstanceData.numInstances, studyLevelData.NumInstances || studyFromInstanceData.numInstances,
displaySets: studyFromInstanceData.displaySets, displaySets: studyFromInstanceData.displaySets,
}; };
}); });
const primary = allStudies.find(study => { if (isSubscribed) {
setStudyData(allStudies);
}
});
return () => (isSubscribed = false);
}, [viewModel.displaySetInstanceUids]);
studyData.forEach(study => {
study.displaySets.forEach(ds => {
ds.imageSrc = thumbnailImageSrcMap.get(ds.displaySetInstanceUid);
});
});
const primary = studyData.find(study => {
return true; // TODO: check study.StudyInstanceUID matches queryparam? return true; // TODO: check study.StudyInstanceUID matches queryparam?
}); });
// TODO: Filter allStudies to dates within one year of current date // TODO: Filter allStudies to dates within one year of current date
const recentStudies = allStudies.filter(study => { const recentStudies = studyData.filter(study => {
return true; // TODO: check study.date return true; // TODO: check study.date
}); });
@ -219,12 +223,13 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
{ {
name: 'all', name: 'all',
label: 'All', label: 'All',
studies: allStudies, studies: studyData,
}, },
]; ];
function onClickStudy(StudyInstanceUID) { function onClickStudy(StudyInstanceUID) {
if (studiesFromInstanceData[StudyInstanceUID]) { const study = studyData.find(a => a.studyInstanceUid === StudyInstanceUID);
if (study && study.displaySets && study.displaySets.length) {
return; return;
} }
@ -239,9 +244,12 @@ function StudyBrowserPanel({ getDataSources, commandsManager }) {
); );
} }
const memoOnClickStudy = useCallback(StudyInstanceUID => { const memoOnClickStudy = useCallback(
StudyInstanceUID => {
onClickStudy(StudyInstanceUID); onClickStudy(StudyInstanceUID);
}); },
[studyData]
);
return <StudyBrowser tabs={tabs} onClickStudy={memoOnClickStudy} />; return <StudyBrowser tabs={tabs} onClickStudy={memoOnClickStudy} />;
} }

View File

@ -34,7 +34,7 @@ const Thumbnail = ({
)} )}
> >
{imageSrc ? ( {imageSrc ? (
<img src={imageSrc} alt={imageAltText} className="min-h-32" /> <img src={imageSrc} alt={imageAltText} className="min-h-32 object-none" />
) : ( ) : (
<div>{imageAltText}</div> <div>{imageAltText}</div>
)} )}