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:
parent
4172d0427b
commit
d5c5951e57
@ -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",
|
||||||
|
|||||||
@ -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]);
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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 = {
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
10
yarn.lock
10
yarn.lock
@ -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==
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user