diff --git a/extensions/debugging/src/DebugReportModal.css b/extensions/debugging/src/DebugReportModal.css index f61e83327d1..679d62539a2 100644 --- a/extensions/debugging/src/DebugReportModal.css +++ b/extensions/debugging/src/DebugReportModal.css @@ -24,3 +24,21 @@ overflow: scroll; max-height: 300px; } + +.debug-overflowText { + margin: 0 auto; + max-width: 300px; + overflow-wrap: break-word; + word-wrap: break-word; + hyphens: auto; +} + +.debug-overflowText-border { + margin: 0 auto; + max-width: 300px; + border: solid 2px #ccc; + padding: 12px; + overflow-wrap: break-word; + word-wrap: break-word; + hyphens: auto; +} diff --git a/extensions/debugging/src/DebugReportModal.js b/extensions/debugging/src/DebugReportModal.js index 5926bb2913f..c8acec293f2 100644 --- a/extensions/debugging/src/DebugReportModal.js +++ b/extensions/debugging/src/DebugReportModal.js @@ -2,6 +2,8 @@ import React from 'react'; import { detect } from 'detect-browser'; import './DebugReportModal.css'; import { ToolbarButton } from '@ohif/ui'; +import { utils } from '@ohif/core'; +const { studyMetadataManager } = utils; const DubugReportModal = ({ viewports, @@ -70,7 +72,7 @@ const DubugReportModal = ({ body += '== Viewport Layout ==\n'; body += `Rows\t${numRows}\n`; body += `Columns\t${numColumns}\n\n`; - body += '== Viewports ==\n'; + body += '== SeriesInstanceUIDs ==\n'; Object.keys(viewportSpecificData).forEach(viewportIndex => { const vsd = viewportSpecificData[viewportIndex]; @@ -83,6 +85,40 @@ const DubugReportModal = ({ body += `[${row},${column}]\t${vsd.SeriesInstanceUID}\n`; }); + body += '== ReferencedSEGSeriesInstanceUIDs ==\n'; + + Object.keys(viewportSpecificData).forEach(viewportIndex => { + const displaySet = viewportSpecificData[viewportIndex]; + const [ + referencedDisplaySetsRef, + referencedDisplaySetsCount, + ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); + + const [row, column] = _viewportIndexToViewportPosition( + viewportIndex, + numColumns + ); + + body += `[${row},${column}]\t${referencedDisplaySetsRef}\n`; + }); + + body += '== ReferencedRTSTRUCTSeriesInstanceUIDs ==\n'; + + Object.keys(viewportSpecificData).forEach(viewportIndex => { + const displaySet = viewportSpecificData[viewportIndex]; + const [ + referencedDisplaySetsRef, + referencedDisplaySetsCount, + ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'RTSTRUCT'); + + const [row, column] = _viewportIndexToViewportPosition( + viewportIndex, + numColumns + ); + + body += `[${row},${column}]\t${referencedDisplaySetsRef}\n`; + }); + return body; }; @@ -171,7 +207,7 @@ const getCurrentStudyUrl = () => { URL - {window.location.href} + {window.location.href} ); @@ -222,6 +258,14 @@ const getLayout = viewports => { SeriesInstanceUIDs {getSeriesInstanceUIDsPerRow(viewports)} + + ReferencedSEGSeriesInstanceUIDs + + {getReferencedSEGSeriesInstanceUIDsPerRow(viewports)} + + ReferencedRTSTRUCTSeriesInstanceUIDs + + {getReferencedRTSTRUCTSeriesInstanceUIDsPerRow(viewports)} ); }; @@ -256,6 +300,129 @@ const getBrowserInfo = () => { ); }; +/** + * Returns DisplaySets that reference the target series, sorted by dateTime + * + * @param {string} StudyInstanceUID + * @param {string} SeriesInstanceUID + * @returns Array + */ +const _getReferencedDisplaysets = ( + StudyInstanceUID, + SeriesInstanceUID, + Modality +) => { + /* Referenced DisplaySets */ + const studyMetadata = studyMetadataManager.get(StudyInstanceUID); + const referencedDisplaysets = studyMetadata.getDerivedDatasets({ + referencedSeriesInstanceUID: SeriesInstanceUID, + Modality, + }); + + /* Sort */ + referencedDisplaysets.sort((a, b) => { + const aNumber = Number(`${a.SeriesDate}${a.SeriesTime}`); + const bNumber = Number(`${b.SeriesDate}${b.SeriesTime}`); + return bNumber - aNumber; + }); + + return referencedDisplaysets; +}; + +const _getReferencedSeriesInstanceUIDsString = (displaySet, Modality) => { + const referencedDisplaySets = _getReferencedDisplaysets( + displaySet.StudyInstanceUID, + displaySet.SeriesInstanceUID, + Modality + ); + + let referencedDisplaySetsRef = 'None'; + const referencedDisplaySetsCount = referencedDisplaySets.length; + if (referencedDisplaySetsCount !== 0) { + referencedDisplaySetsRef = ''; + for (let i = 0; i < referencedDisplaySetsCount - 1; i++) { + referencedDisplaySetsRef += + referencedDisplaySets[i].SeriesInstanceUID + ', '; + } + referencedDisplaySetsRef += + referencedDisplaySets[referencedDisplaySetsCount - 1].SeriesInstanceUID; + } + + return [referencedDisplaySetsRef, referencedDisplaySetsCount]; +}; + +const getReferencedSEGSeriesInstanceUIDsPerRow = viewports => { + const { viewportSpecificData, numColumns } = viewports; + + // NOTE viewportSpecificData is actually an object with numerical keys. + return Object.keys(viewportSpecificData).map(viewportIndex => { + const displaySet = viewportSpecificData[viewportIndex]; + const [ + referencedDisplaySetsRef, + referencedDisplaySetsCount, + ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); + + const [row, column] = _viewportIndexToViewportPosition( + viewportIndex, + numColumns + ); + + if (referencedDisplaySetsCount > 1) { + return ( + + {`[${row},${column}]`} + + {referencedDisplaySetsRef} + + + ); + } else { + return ( + + {`[${row},${column}]`} + {referencedDisplaySetsRef} + + ); + } + }); +}; + +const getReferencedRTSTRUCTSeriesInstanceUIDsPerRow = viewports => { + const { viewportSpecificData, numColumns } = viewports; + + // NOTE viewportSpecificData is actually an object with numerical keys. + return Object.keys(viewportSpecificData).map(viewportIndex => { + const displaySet = viewportSpecificData[viewportIndex]; + const [ + referencedDisplaySetsRef, + referencedDisplaySetsCount, + ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'RTSTRUCT'); + + const [row, column] = _viewportIndexToViewportPosition( + viewportIndex, + numColumns + ); + + if (referencedDisplaySetsCount > 1) { + return ( + + {`[${row},${column}]`} + + {referencedDisplaySetsRef} + + + ); + } else { + return ( + + {`[${row},${column}]`} + {referencedDisplaySetsRef} + + ); + } + }); +}; + const getSeriesInstanceUIDsPerRow = viewports => { const { viewportSpecificData, numColumns } = viewports;