From 62a2cd5ff38d23637767feb0b212f325d5c9af3b Mon Sep 17 00:00:00 2001 From: Emanuel Fiuza de Oliveira Date: Thu, 4 Jun 2020 08:01:05 -0300 Subject: [PATCH] Fix: #1130 Fixing support for download of an entire study (#1753) Co-authored-by: James Petts --- .../dicom-p10-downloader/src/commandsModule.js | 14 ++++++++++++++ extensions/dicom-p10-downloader/src/utils.js | 5 +++++ .../utils/findMostRecentStructuredReport.js | 2 +- platform/core/src/redux/reducers/studies.js | 7 ++++--- .../ConnectedViewerRetrieveStudyData.js | 5 ++++- .../connectedComponents/ViewerRetrieveStudyData.js | 12 ++++++++++++ 6 files changed, 40 insertions(+), 5 deletions(-) diff --git a/extensions/dicom-p10-downloader/src/commandsModule.js b/extensions/dicom-p10-downloader/src/commandsModule.js index f9aa65df3..ae784839c 100644 --- a/extensions/dicom-p10-downloader/src/commandsModule.js +++ b/extensions/dicom-p10-downloader/src/commandsModule.js @@ -2,6 +2,7 @@ import OHIF from '@ohif/core'; import { save, getDicomWebClientFromContext, + getStudyInstanceUIDFromStudies, getSOPInstanceReferenceFromActiveViewport, getSOPInstanceReferencesFromViewports, } from './utils'; @@ -41,6 +42,14 @@ export function getCommands(context) { listOfUIDs ); }, + downloadAndZipStudy({ servers, studies, progress }) { + const dicomWebClient = getDicomWebClientFromContext(context, servers); + const listOfUIDs = getStudyInstanceUIDFromStudies(studies); + return save( + _downloadAndZip(dicomWebClient, listOfUIDs, { progress }), + listOfUIDs + ); + }, downloadAndZipSeriesOnViewports({ servers, viewports, progress }) { const dicomWebClient = getDicomWebClientFromContext(context, servers); const listOfUIDs = getSOPInstanceReferencesFromViewports(viewports); @@ -64,6 +73,11 @@ export function getCommands(context) { commandFn: queue.bindSafe(actions.downloadAndZip, error), storeContexts: ['servers'], }, + downloadAndZipStudy: { + commandFn: queue.bindSafe(actions.downloadAndZipStudy, error), + storeContexts: ['servers', 'studies'], + options: { progress }, + }, downloadAndZipSeriesOnViewports: { commandFn: queue.bindSafe(actions.downloadAndZipSeriesOnViewports, error), storeContexts: ['servers', 'viewports'], diff --git a/extensions/dicom-p10-downloader/src/utils.js b/extensions/dicom-p10-downloader/src/utils.js index d606d1f77..0a3cc9707 100644 --- a/extensions/dicom-p10-downloader/src/utils.js +++ b/extensions/dicom-p10-downloader/src/utils.js @@ -100,11 +100,16 @@ function save(promise, listOfUIDs) { }); } +function getStudyInstanceUIDFromStudies(studies) { + return Object.keys(Object(Object(studies).studyData)).slice(0, 1); +} + export { save, validDicomUid, getDicomWebClientFromConfig, getDicomWebClientFromContext, + getStudyInstanceUIDFromStudies, getSOPInstanceReferenceFromActiveViewport, getSOPInstanceReferencesFromViewports, }; diff --git a/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js b/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js index 9f8a3129a..9df728ed1 100644 --- a/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js +++ b/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js @@ -13,7 +13,7 @@ const findMostRecentStructuredReport = studies => { // Skip series that may not have instances yet // This can happen if we have retrieved just the initial // details about the series via QIDO-RS, but not the full metadata - if (!series.instances.length) { + if (!series.instances || !series.instances.length) { return; } diff --git a/platform/core/src/redux/reducers/studies.js b/platform/core/src/redux/reducers/studies.js index b2545a281..5d437c98b 100644 --- a/platform/core/src/redux/reducers/studies.js +++ b/platform/core/src/redux/reducers/studies.js @@ -6,11 +6,12 @@ const defaultState = { const servers = (state = defaultState, action) => { switch (action.type) { - case 'SET_STUDY_DATA': - const updatedStudyData = cloneDeep(state).studyData; - updatedStudyData[action.StudyInstanceUID] = action.data; + case 'SET_STUDY_DATA': { + const updatedStudyData = cloneDeep(state.studyData); + updatedStudyData[action.StudyInstanceUID] = cloneDeep(action.data); return Object.assign({}, state, { studyData: updatedStudyData }); + } default: return state; } diff --git a/platform/viewer/src/connectedComponents/ConnectedViewerRetrieveStudyData.js b/platform/viewer/src/connectedComponents/ConnectedViewerRetrieveStudyData.js index 387bea839..f675e9ef1 100644 --- a/platform/viewer/src/connectedComponents/ConnectedViewerRetrieveStudyData.js +++ b/platform/viewer/src/connectedComponents/ConnectedViewerRetrieveStudyData.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux'; import ViewerRetrieveStudyData from './ViewerRetrieveStudyData.js'; import OHIF from '@ohif/core'; -const { clearViewportSpecificData } = OHIF.redux.actions; +const { clearViewportSpecificData, setStudyData } = OHIF.redux.actions; const isActive = a => a.active === true; const mapStateToProps = (state, ownProps) => { @@ -14,6 +14,9 @@ const mapStateToProps = (state, ownProps) => { }; const mapDispatchToProps = dispatch => { return { + setStudyData: (StudyInstanceUID, data) => { + dispatch(setStudyData(StudyInstanceUID, data)); + }, clearViewportSpecificData: () => { dispatch(clearViewportSpecificData()); }, diff --git a/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js b/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js index db607494a..5b7fbe3cd 100644 --- a/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js +++ b/platform/viewer/src/connectedComponents/ViewerRetrieveStudyData.js @@ -154,11 +154,21 @@ const _sortStudyDisplaySet = (study, studyMetadata) => { studyMetadata.sortDisplaySets(study.displaySets); }; +const _thinStudyData = study => { + return { + StudyInstanceUID: study.StudyInstanceUID, + series: study.series.map(item => ({ + SeriesInstanceUID: item.SeriesInstanceUID + })), + } +}; + function ViewerRetrieveStudyData({ server, studyInstanceUIDs, seriesInstanceUIDs, clearViewportSpecificData, + setStudyData, }) { // hooks const [error, setError] = useState(false); @@ -220,6 +230,7 @@ function ViewerRetrieveStudyData({ if (Array.isArray(studiesData) && studiesData.length > 0) { // Map studies to new format, update metadata manager? const studies = studiesData.map(study => { + setStudyData(study.StudyInstanceUID, _thinStudyData(study)); const studyMetadata = new OHIFStudyMetadata( study, study.StudyInstanceUID @@ -369,6 +380,7 @@ ViewerRetrieveStudyData.propTypes = { seriesInstanceUIDs: PropTypes.array, server: PropTypes.object, clearViewportSpecificData: PropTypes.func.isRequired, + setStudyData: PropTypes.func.isRequired, }; export default ViewerRetrieveStudyData;