fix(SR): KO series being displayed in browser list (#3382)

* fix: KO series being displayed in browser list

* fix sr for volume viewports

* move highlight labelmap to RAF

* remove commented code

* fix the hydration bug for the SR

* apply review comments

* revert the key images for sr

* Remove some obsolete changes

* set initial image for sr instead of jump

* Remove viewportType stack

---------

Co-authored-by: Alireza <ar.sedghi@gmail.com>
This commit is contained in:
Bill Wallace 2023-05-15 08:23:13 -04:00 committed by GitHub
parent 4172d0427b
commit d5c5951e57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 243 additions and 223 deletions

View File

@ -42,20 +42,20 @@
"webpack-merge": "^5.7.3" "webpack-merge": "^5.7.3"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "7.7.6", "@babel/runtime": "^7.20.13",
"react-color": "^2.19.3" "react-color": "^2.19.3"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.5.0", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.5.0", "@babel/plugin-proposal-class-properties": "^7.5.0",
"@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5", "@babel/plugin-transform-regenerator": "^7.16.7",
"@babel/plugin-transform-runtime": "^7.5.0", "@babel/plugin-transform-runtime": "^7.17.0",
"babel-plugin-inline-react-svg": "^2.0.1", "babel-plugin-inline-react-svg": "^2.0.1",
"@babel/preset-env": "^7.5.0", "@babel/preset-env": "^7.5.0",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.16.7",
"babel-eslint": "^8.0.3", "babel-eslint": "^8.0.3",
"babel-loader": "^8.0.0-beta.4", "babel-loader": "^8.0.0-beta.4",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "^4.0.0",

View File

@ -113,7 +113,6 @@ function OHIFCornerstoneRTViewport(props) {
}} }}
onElementEnabled={onElementEnabled} onElementEnabled={onElementEnabled}
onElementDisabled={onElementDisabled} onElementDisabled={onElementDisabled}
// initialImageIndex={initialImageIndex}
></Component> ></Component>
); );
}, [viewportIndex, rtDisplaySet, toolGroupId]); }, [viewportIndex, rtDisplaySet, toolGroupId]);

View File

@ -46,16 +46,16 @@
"react-color": "^2.19.3" "react-color": "^2.19.3"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.5.0", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.5.0", "@babel/plugin-proposal-class-properties": "^7.5.0",
"@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5", "@babel/plugin-transform-regenerator": "^7.16.7",
"@babel/plugin-transform-runtime": "^7.5.0", "@babel/plugin-transform-runtime": "^7.17.0",
"babel-plugin-inline-react-svg": "^2.0.1", "babel-plugin-inline-react-svg": "^2.0.1",
"@babel/preset-env": "^7.5.0", "@babel/preset-env": "^7.5.0",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.16.7",
"babel-eslint": "^8.0.3", "babel-eslint": "^8.0.3",
"babel-loader": "^8.0.0-beta.4", "babel-loader": "^8.0.0-beta.4",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "^4.0.0",

View File

@ -82,13 +82,6 @@ function addInstances(
// gets loaded, and to navigate among them. // gets loaded, and to navigate among them.
this.instance = this.instances[this.instances.length - 1]; this.instance = this.instances[this.instances.length - 1];
this.isLoaded = false; this.isLoaded = false;
if (this.keyImageDisplaySet) {
this.load();
this.keyImageDisplaySet.updateInstances();
displaySetService.setDisplaySetMetadataInvalidated(
this.keyImageDisplaySet.displaySetInstanceUID
);
}
return this; return this;
} }

View File

@ -50,7 +50,7 @@ const findReferencedInstances = (
const createReferencedImageDisplaySet = (displaySetService, displaySet) => { const createReferencedImageDisplaySet = (displaySetService, displaySet) => {
const instances = findReferencedInstances(displaySetService, displaySet); const instances = findReferencedInstances(displaySetService, displaySet);
// This will be a member function of the created image set // This will be a member function of the created image set
const updateInstances = function () { const updateInstances = function() {
this.images.splice( this.images.splice(
0, 0,
this.images.length, this.images.length,
@ -78,6 +78,7 @@ const createReferencedImageDisplaySet = (displaySetService, displaySet) => {
// This object is made of multiple instances from other series // This object is made of multiple instances from other series
isCompositeStack: true, isCompositeStack: true,
madeInClient: true, madeInClient: true,
excludeFromThumbnailBrowser: true,
updateInstances, updateInstances,
}); });

View File

@ -7,7 +7,6 @@ import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSR
import { Icon, Tooltip, useViewportGrid, ViewportActionBar } from '@ohif/ui'; import { Icon, Tooltip, useViewportGrid, ViewportActionBar } from '@ohif/ui';
import hydrateStructuredReport from '../utils/hydrateStructuredReport'; import hydrateStructuredReport from '../utils/hydrateStructuredReport';
import createReferencedImageDisplaySet from '../utils/createReferencedImageDisplaySet';
const { formatDate } = utils; const { formatDate } = utils;
@ -22,8 +21,8 @@ function OHIFCornerstoneSRViewport(props) {
dataSource, dataSource,
displaySets, displaySets,
viewportIndex, viewportIndex,
viewportOptions,
viewportLabel, viewportLabel,
viewportOptions,
servicesManager, servicesManager,
extensionManager, extensionManager,
} = props; } = props;
@ -80,9 +79,9 @@ function OHIFCornerstoneSRViewport(props) {
{ servicesManager, extensionManager }, { servicesManager, extensionManager },
displaySetInstanceUID displaySetInstanceUID
); );
const displaySets = srDisplaySet.keyImageDisplaySet const displaySets = displaySetService.getDisplaySetsForSeries(
? [srDisplaySet.keyImageDisplaySet] SeriesInstanceUIDs[0]
: displaySetService.getDisplaySetsForSeries(SeriesInstanceUIDs[0]); );
if (displaySets.length) { if (displaySets.length) {
viewportGridService.setDisplaySetsForViewports([ viewportGridService.setDisplaySetsForViewports([
{ {
@ -210,9 +209,19 @@ function OHIFCornerstoneSRViewport(props) {
// should be passed second since we don't want SR displaySet to // should be passed second since we don't want SR displaySet to
// override the activeImageDisplaySetData // override the activeImageDisplaySetData
displaySets={[activeImageDisplaySetData]} displaySets={[activeImageDisplaySetData]}
// It is possible that there is a hanging protocol applying viewportOptions
// for the SR, so inherit the viewport options
// TODO: Ensure the viewport options are set correctly with respect to
// stack etc, in the incoming viewport options.
viewportOptions={{ viewportOptions={{
...viewportOptions, ...viewportOptions,
toolGroupId: `${SR_TOOLGROUP_BASE_NAME}`, toolGroupId: `${SR_TOOLGROUP_BASE_NAME}`,
// viewportType should not be required, as the stack type should be
// required already in order to view SR, but sometimes segmentation
// views set the viewport type without fixing the allowed display
viewportType: 'stack',
// The positionIds for the viewport aren't meaningful for the child display sets
positionIds: null,
}} }}
onElementEnabled={onElementEnabled} onElementEnabled={onElementEnabled}
initialImageIndex={initialImageIndex} initialImageIndex={initialImageIndex}
@ -420,18 +429,14 @@ async function _getViewportReferencedDisplaySetData(
measurementSelected, measurementSelected,
displaySetService displaySetService
) { ) {
if (!displaySet.keyImageDisplaySet) { const { measurements } = displaySet;
// Create a new display set, and preserve a reference to it here, const measurement = measurements[measurementSelected];
// so that it can be re-displayed and shown inside the SR viewport.
// This is only for ease of redisplay - the display set is stored in the
// usual manner in the display set service.
displaySet.keyImageDisplaySet = createReferencedImageDisplaySet(
displaySetService,
displaySet
);
}
const referencedDisplaySet = displaySet.keyImageDisplaySet; const { displaySetInstanceUID } = measurement;
const referencedDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID
);
const image0 = referencedDisplaySet.images[0]; const image0 = referencedDisplaySet.images[0];
const referencedDisplaySetMetadata = { const referencedDisplaySetMetadata = {

View File

@ -567,8 +567,9 @@ function _subscribeToJumpToMeasurementEvents(
{ referencedImageId: measurement.referencedImageId } { referencedImageId: measurement.referencedImageId }
); );
} }
if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportIndex) if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportIndex) {
return; return;
}
_jumpToMeasurement( _jumpToMeasurement(
measurement, measurement,
elementRef, elementRef,

View File

@ -1247,37 +1247,39 @@ class SegmentationService extends PubSubService {
const { fillAlpha } = this.getConfiguration(toolGroupId); const { fillAlpha } = this.getConfiguration(toolGroupId);
let count = 0; let startTime: number = null;
const intervalTime = 16; const animation = (timestamp: number) => {
const numberOfFrames = Math.ceil(animationLength / intervalTime); if (startTime === null) {
startTime = timestamp;
}
const elapsed = timestamp - startTime;
const progress = Math.min(elapsed / animationLength, 1);
this.highlightIntervalId = setInterval(() => {
const x = (count * intervalTime) / animationLength;
cstSegmentation.config.setSegmentSpecificConfig( cstSegmentation.config.setSegmentSpecificConfig(
toolGroupId, toolGroupId,
segmentationRepresentation.segmentationRepresentationUID, segmentationRepresentation.segmentationRepresentationUID,
{ {
[segmentIndex]: { [segmentIndex]: {
LABELMAP: { LABELMAP: {
fillAlpha: easeInOutBell(x, fillAlpha), fillAlpha: easeInOutBell(progress, fillAlpha),
}, },
}, },
} }
); );
count++; if (progress < 1) {
requestAnimationFrame(animation);
if (count === numberOfFrames) { } else {
clearInterval(this.highlightIntervalId);
cstSegmentation.config.setSegmentSpecificConfig( cstSegmentation.config.setSegmentSpecificConfig(
toolGroupId, toolGroupId,
segmentationRepresentation.segmentationRepresentationUID, segmentationRepresentation.segmentationRepresentationUID,
{} {}
); );
this.highlightIntervalId = null;
} }
}, intervalTime); };
requestAnimationFrame(animation);
} }
private _highlightContour( private _highlightContour(

View File

@ -296,34 +296,36 @@ function _mapDisplaySets(displaySets, thumbnailImageSrcMap) {
const thumbnailDisplaySets = []; const thumbnailDisplaySets = [];
const thumbnailNoImageDisplaySets = []; const thumbnailNoImageDisplaySets = [];
displaySets.forEach(ds => { displaySets
const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID]; .filter(ds => !ds.excludeFromThumbnailBrowser)
const componentType = _getComponentType(ds.Modality); .forEach(ds => {
const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID];
const componentType = _getComponentType(ds.Modality);
const array = const array =
componentType === 'thumbnail' componentType === 'thumbnail'
? thumbnailDisplaySets ? thumbnailDisplaySets
: thumbnailNoImageDisplaySets; : thumbnailNoImageDisplaySets;
array.push({ array.push({
displaySetInstanceUID: ds.displaySetInstanceUID,
description: ds.SeriesDescription || '',
seriesNumber: ds.SeriesNumber,
modality: ds.Modality,
seriesDate: ds.SeriesDate,
seriesTime: ds.SeriesTime,
numInstances: ds.numImageFrames,
countIcon: ds.countIcon,
StudyInstanceUID: ds.StudyInstanceUID,
componentType,
imageSrc,
dragData: {
type: 'displayset',
displaySetInstanceUID: ds.displaySetInstanceUID, displaySetInstanceUID: ds.displaySetInstanceUID,
// .. Any other data to pass description: ds.SeriesDescription || '',
}, seriesNumber: ds.SeriesNumber,
modality: ds.Modality,
seriesDate: ds.SeriesDate,
seriesTime: ds.SeriesTime,
numInstances: ds.numImageFrames,
countIcon: ds.countIcon,
StudyInstanceUID: ds.StudyInstanceUID,
componentType,
imageSrc,
dragData: {
type: 'displayset',
displaySetInstanceUID: ds.displaySetInstanceUID,
// .. Any other data to pass
},
});
}); });
});
return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets]; return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];
} }

View File

@ -43,15 +43,15 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.13", "@babel/runtime": "^7.20.13",
"@cornerstonejs/codec-charls": "^0.1.1", "@cornerstonejs/codec-charls": "^1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^0.0.7", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^0.1.1", "@cornerstonejs/codec-openjpeg": "^1.2.2",
"colormap": "^2.3", "colormap": "^2.3",
"dicom-microscopy-viewer": "^0.44.0", "dicom-microscopy-viewer": "^0.44.0",
"dicomicc": "^0.1" "dicomicc": "^0.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.8", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6",

View File

@ -31,12 +31,11 @@ function TrackedMeasurementsContextProvider(
) { ) {
const [viewportGrid, viewportGridService] = useViewportGrid(); const [viewportGrid, viewportGridService] = useViewportGrid();
const { activeViewportIndex, viewports } = viewportGrid; const { activeViewportIndex, viewports } = viewportGrid;
const { measurementService, displaySetService } = servicesManager.services;
const machineOptions = Object.assign({}, defaultOptions); const machineOptions = Object.assign({}, defaultOptions);
machineOptions.actions = Object.assign({}, machineOptions.actions, { machineOptions.actions = Object.assign({}, machineOptions.actions, {
jumpToFirstMeasurementInActiveViewport: (ctx, evt) => { jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {
const { measurementService } = servicesManager.services;
const { trackedStudy, trackedSeries } = ctx; const { trackedStudy, trackedSeries } = ctx;
const measurements = measurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter( const trackedMeasurements = measurements.filter(
@ -45,21 +44,51 @@ function TrackedMeasurementsContextProvider(
trackedSeries.includes(m.referenceSeriesUID) trackedSeries.includes(m.referenceSeriesUID)
); );
const uid = trackedMeasurements[0].uid;
console.log( console.log(
'jumping to measurement reset viewport', 'jumping to measurement reset viewport',
viewportGrid.activeViewportIndex, viewportGrid.activeViewportIndex,
trackedMeasurements[0] trackedMeasurements[0]
); );
const referencedDisplaySetUID =
trackedMeasurements[0].displaySetInstanceUID;
const referencedDisplaySet = displaySetService.getDisplaySetByUID(
referencedDisplaySetUID
);
const referencedImages = referencedDisplaySet.images;
const isVolumeIdReferenced = referencedImages[0].imageId.startsWith(
'volumeId'
);
const measurementData = trackedMeasurements[0].data;
let imageIndex = 0;
if (!isVolumeIdReferenced && measurementData) {
// if it is imageId referenced find the index of the imageId, we don't have
// support for volumeId referenced images yet
imageIndex = referencedImages.findIndex(image => {
const imageIdToUse = Object.keys(measurementData)[0].substring(8);
return image.imageId === imageIdToUse;
});
if (imageIndex === -1) {
console.warn(
'Could not find image index for tracked measurement, using 0'
);
imageIndex = 0;
}
}
viewportGridService.setDisplaySetsForViewport({ viewportGridService.setDisplaySetsForViewport({
viewportIndex: viewportGrid.activeViewportIndex, viewportIndex: viewportGrid.activeViewportIndex,
displaySetInstanceUIDs: [trackedMeasurements[0].displaySetInstanceUID], displaySetInstanceUIDs: [referencedDisplaySetUID],
viewportOptions: {
initialImageOptions: {
index: imageIndex,
},
},
}); });
measurementService.jumpToMeasurement(
viewportGrid.activeViewportIndex,
uid
);
}, },
showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => { showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {
if (evt.data.createdDisplaySetInstanceUIDs.length > 0) { if (evt.data.createdDisplaySetInstanceUIDs.length > 0) {
@ -73,7 +102,6 @@ function TrackedMeasurementsContextProvider(
} }
}, },
discardPreviouslyTrackedMeasurements: (ctx, evt) => { discardPreviouslyTrackedMeasurements: (ctx, evt) => {
const { measurementService } = servicesManager.services;
const measurements = measurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const filteredMeasurements = measurements.filter(ms => const filteredMeasurements = measurements.filter(ms =>
ctx.prevTrackedSeries.includes(ms.referenceSeriesUID) ctx.prevTrackedSeries.includes(ms.referenceSeriesUID)
@ -85,7 +113,6 @@ function TrackedMeasurementsContextProvider(
} }
}, },
clearAllMeasurements: (ctx, evt) => { clearAllMeasurements: (ctx, evt) => {
const { measurementService } = servicesManager.services;
const measurements = measurementService.getMeasurements(); const measurements = measurementService.getMeasurements();
const measurementIds = measurements.map(fm => fm.uid); const measurementIds = measurements.map(fm => fm.uid);

View File

@ -439,124 +439,130 @@ function _mapDisplaySets(
) { ) {
const thumbnailDisplaySets = []; const thumbnailDisplaySets = [];
const thumbnailNoImageDisplaySets = []; const thumbnailNoImageDisplaySets = [];
displaySets.forEach(ds => { displaySets
const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID]; .filter(ds => !ds.excludeFromThumbnailBrowser)
const componentType = _getComponentType(ds.Modality); .forEach(ds => {
const numPanes = viewportGridService.getNumViewportPanes(); const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID];
const viewportIdentificator = const componentType = _getComponentType(ds.Modality);
numPanes === 1 const numPanes = viewportGridService.getNumViewportPanes();
? [] const viewportIdentificator =
: viewports.reduce((acc, viewportData, index) => { numPanes === 1
if ( ? []
index < numPanes && : viewports.reduce((acc, viewportData, index) => {
viewportData?.displaySetInstanceUIDs?.includes( if (
ds.displaySetInstanceUID index < numPanes &&
) viewportData?.displaySetInstanceUIDs?.includes(
) { ds.displaySetInstanceUID
acc.push(viewportData.viewportLabel); )
} ) {
return acc; acc.push(viewportData.viewportLabel);
}, []); }
return acc;
}, []);
const array = const array =
componentType === 'thumbnailTracked' componentType === 'thumbnailTracked'
? thumbnailDisplaySets ? thumbnailDisplaySets
: thumbnailNoImageDisplaySets; : thumbnailNoImageDisplaySets;
const { displaySetInstanceUID } = ds; const { displaySetInstanceUID } = ds;
const thumbnailProps = { const thumbnailProps = {
displaySetInstanceUID,
description: ds.SeriesDescription,
seriesNumber: ds.SeriesNumber,
modality: ds.Modality,
seriesDate: formatDate(ds.SeriesDate),
numInstances: ds.numImageFrames,
countIcon: ds.countIcon,
StudyInstanceUID: ds.StudyInstanceUID,
componentType,
imageSrc,
dragData: {
type: 'displayset',
displaySetInstanceUID, displaySetInstanceUID,
// .. Any other data to pass description: ds.SeriesDescription,
}, seriesNumber: ds.SeriesNumber,
isTracked: trackedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID), modality: ds.Modality,
viewportIdentificator, seriesDate: formatDate(ds.SeriesDate),
}; numInstances: ds.numImageFrames,
countIcon: ds.countIcon,
StudyInstanceUID: ds.StudyInstanceUID,
componentType,
imageSrc,
dragData: {
type: 'displayset',
displaySetInstanceUID,
// .. Any other data to pass
},
isTracked: trackedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID),
viewportIdentificator,
};
if (componentType === 'thumbnailNoImage') { if (componentType === 'thumbnailNoImage') {
if (dataSource.reject && dataSource.reject.series) { if (dataSource.reject && dataSource.reject.series) {
thumbnailProps.canReject = true; thumbnailProps.canReject = true;
thumbnailProps.onReject = () => { thumbnailProps.onReject = () => {
uiDialogService.create({ uiDialogService.create({
id: 'ds-reject-sr', id: 'ds-reject-sr',
centralize: true, centralize: true,
isDraggable: false, isDraggable: false,
showOverlay: true, showOverlay: true,
content: Dialog, content: Dialog,
contentProps: { contentProps: {
title: 'Delete Report', title: 'Delete Report',
body: () => ( body: () => (
<div className="p-4 text-white bg-primary-dark"> <div className="p-4 text-white bg-primary-dark">
<p>Are you sure you want to delete this report?</p> <p>Are you sure you want to delete this report?</p>
<p>This action cannot be undone.</p> <p>This action cannot be undone.</p>
</div> </div>
), ),
actions: [ actions: [
{ id: 'cancel', text: 'Cancel', type: 'secondary' }, { id: 'cancel', text: 'Cancel', type: 'secondary' },
{ {
id: 'yes', id: 'yes',
text: 'Yes', text: 'Yes',
type: 'primary', type: 'primary',
classes: ['reject-yes-button'], classes: ['reject-yes-button'],
},
],
onClose: () => uiDialogService.dismiss({ id: 'ds-reject-sr' }),
onShow: () => {
const yesButton = document.querySelector(
'.reject-yes-button'
);
yesButton.focus();
}, },
], onSubmit: async ({ action }) => {
onClose: () => uiDialogService.dismiss({ id: 'ds-reject-sr' }), switch (action.id) {
onShow: () => { case 'yes':
const yesButton = document.querySelector('.reject-yes-button'); try {
await dataSource.reject.series(
yesButton.focus(); ds.StudyInstanceUID,
}, ds.SeriesInstanceUID
onSubmit: async ({ action }) => { );
switch (action.id) { displaySetService.deleteDisplaySet(
case 'yes': displaySetInstanceUID
try { );
await dataSource.reject.series( uiDialogService.dismiss({ id: 'ds-reject-sr' });
ds.StudyInstanceUID, uiNotificationService.show({
ds.SeriesInstanceUID title: 'Delete Report',
); message: 'Report deleted successfully',
displaySetService.deleteDisplaySet(displaySetInstanceUID); type: 'success',
});
} catch (error) {
uiDialogService.dismiss({ id: 'ds-reject-sr' });
uiNotificationService.show({
title: 'Delete Report',
message: 'Failed to delete report',
type: 'error',
});
}
break;
case 'cancel':
uiDialogService.dismiss({ id: 'ds-reject-sr' }); uiDialogService.dismiss({ id: 'ds-reject-sr' });
uiNotificationService.show({ break;
title: 'Delete Report', }
message: 'Report deleted successfully', },
type: 'success',
});
} catch (error) {
uiDialogService.dismiss({ id: 'ds-reject-sr' });
uiNotificationService.show({
title: 'Delete Report',
message: 'Failed to delete report',
type: 'error',
});
}
break;
case 'cancel':
uiDialogService.dismiss({ id: 'ds-reject-sr' });
break;
}
}, },
}, });
}); };
}; } else {
} else { thumbnailProps.canReject = false;
thumbnailProps.canReject = false; }
} }
}
array.push(thumbnailProps); array.push(thumbnailProps);
}); });
return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets]; return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];
} }

View File

@ -37,7 +37,7 @@
"@babel/runtime": "^7.20.13" "@babel/runtime": "^7.20.13"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.8", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6",

View File

@ -64,7 +64,7 @@
"react-dom": "17.0.2" "react-dom": "17.0.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.8", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6",
@ -147,6 +147,7 @@
] ]
}, },
"resolutions": { "resolutions": {
"@cornerstonejs/core": "^0.46.2",
"**/@babel/runtime": "^7.20.13", "**/@babel/runtime": "^7.20.13",
"nth-check": "^2.1.1", "nth-check": "^2.1.1",
"trim-newlines": "^5.0.0", "trim-newlines": "^5.0.0",

View File

@ -18,7 +18,7 @@
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "^7.13.10", "@babel/core": "^7.21.4",
"chalk": "^5.0.0", "chalk": "^5.0.0",
"commander": "^8.3.0", "commander": "^8.3.0",
"axios": "^0.26.1", "axios": "^0.26.1",

View File

@ -32,7 +32,7 @@
"@babel/runtime": "^7.20.13" "@babel/runtime": "^7.20.13"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.8", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6",

View File

@ -23,7 +23,7 @@
"@babel/runtime": "^7.20.13" "@babel/runtime": "^7.20.13"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.8", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6",

View File

@ -78,7 +78,7 @@ export default class DisplaySetService extends PubSubService {
if (!activeDisplaySetsMap.has(displaySet.displaySetInstanceUID)) { if (!activeDisplaySetsMap.has(displaySet.displaySetInstanceUID)) {
this.activeDisplaySetsChanged = true; this.activeDisplaySetsChanged = true;
activeDisplaySets.push(displaySet); activeDisplaySets.push(displaySet);
activeDisplaySetsMap.set(displaySet.displayInstanceUID, displaySet); activeDisplaySetsMap.set(displaySet.displaySetInstanceUID, displaySet);
} }
}); });
} }

View File

@ -2,26 +2,9 @@ import React, { useEffect, useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ServicesManager, Types, MeasurementService } from '@ohif/core'; import { ServicesManager, Types, MeasurementService } from '@ohif/core';
import { ViewportGrid, ViewportPane, useViewportGrid } from '@ohif/ui'; import { ViewportGrid, ViewportPane, useViewportGrid } from '@ohif/ui';
import { utils } from '@ohif/core';
import EmptyViewport from './EmptyViewport'; import EmptyViewport from './EmptyViewport';
import classNames from 'classnames'; import classNames from 'classnames';
const { isEqualWithin } = utils;
const ORIENTATION_MAP = {
axial: {
viewPlaneNormal: [0, 0, -1],
viewUp: [0, -1, 0],
},
sagittal: {
viewPlaneNormal: [1, 0, 0],
viewUp: [0, 0, 1],
},
coronal: {
viewPlaneNormal: [0, 1, 0],
viewUp: [0, 0, 1],
},
};
function ViewerViewportGrid(props) { function ViewerViewportGrid(props) {
const { servicesManager, viewportComponents, dataSource } = props; const { servicesManager, viewportComponents, dataSource } = props;

View File

@ -202,7 +202,7 @@
semver "^5.4.1" semver "^5.4.1"
source-map "^0.5.0" source-map "^0.5.0"
"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.10", "@babel/core@^7.13.16", "@babel/core@^7.17.8", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.20.2", "@babel/core@^7.21.4", "@babel/core@^7.5.0", "@babel/core@^7.7.5", "@babel/core@~7.21.0": "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.20.2", "@babel/core@^7.21.4", "@babel/core@^7.7.5", "@babel/core@~7.21.0":
version "7.21.4" version "7.21.4"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659"
integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==
@ -1058,7 +1058,7 @@
"@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-annotate-as-pure" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.20.5", "@babel/plugin-transform-regenerator@^7.4.5": "@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.20.5":
version "7.20.5" version "7.20.5"
resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d"
integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==
@ -1073,7 +1073,7 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-runtime@^7.17.0", "@babel/plugin-transform-runtime@^7.18.6", "@babel/plugin-transform-runtime@^7.5.0": "@babel/plugin-transform-runtime@^7.17.0", "@babel/plugin-transform-runtime@^7.18.6":
version "7.21.4" version "7.21.4"
resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa"
integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==
@ -1247,7 +1247,7 @@
"@babel/types" "^7.4.4" "@babel/types" "^7.4.4"
esutils "^2.0.2" esutils "^2.0.2"
"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.7", "@babel/preset-react@^7.18.6": "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.7", "@babel/preset-react@^7.18.6":
version "7.18.6" version "7.18.6"
resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d"
integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==
@ -1302,7 +1302,7 @@
core-js-pure "^3.25.1" core-js-pure "^3.25.1"
regenerator-runtime "^0.13.11" regenerator-runtime "^0.13.11"
"@babel/runtime@7.17.9", "@babel/runtime@7.7.6", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": "@babel/runtime@7.17.9", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.21.0" version "7.21.0"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==