Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14da247318 | ||
|
|
6a77d6c778 | ||
|
|
8f1785446b | ||
|
|
41225eefc0 | ||
|
|
7772fee21a | ||
|
|
d870ac914a | ||
|
|
451f7eab92 | ||
|
|
029f8af4c7 | ||
|
|
b1b4c8c861 | ||
|
|
cdde2af224 | ||
|
|
4a2922dda0 | ||
|
|
b6b5a8414f | ||
|
|
e7cc735c03 | ||
|
|
6121bdcf63 | ||
|
|
da70079675 | ||
|
|
9089875ca7 | ||
|
|
b4627ecfa3 | ||
|
|
4ede8a525a | ||
|
|
2c23818c86 | ||
|
|
fa4b03d62d | ||
|
|
698e900b85 | ||
|
|
b7d47383c5 | ||
|
|
6123741765 | ||
|
|
ab25be3520 | ||
|
|
950a54c704 | ||
|
|
4293c073f0 | ||
|
|
62a2cd5ff3 | ||
|
|
2d827c2a49 | ||
|
|
a8305772d0 | ||
|
|
eab115e70c | ||
|
|
c02b232b0c | ||
|
|
f01640d009 | ||
|
|
63fd65690c |
@ -21,6 +21,19 @@ mv platform/viewer/dist/* .netlify/www/pwa -v
|
|||||||
# Build && Move script output
|
# Build && Move script output
|
||||||
# yarn run build:package
|
# yarn run build:package
|
||||||
|
|
||||||
|
# Build && Move Docz Output
|
||||||
|
# Using local yarn install to prevent Gatsby from needing to access
|
||||||
|
# node_modules above the platform/ui folder
|
||||||
|
cd platform/ui
|
||||||
|
yarn install
|
||||||
|
yarn run build
|
||||||
|
cd ../..
|
||||||
|
mkdir -p ./.netlify/www/ui
|
||||||
|
mv platform/ui/.docz/dist/* .netlify/www/ui -v
|
||||||
|
|
||||||
|
# Cache all of the node_module dependencies in
|
||||||
|
# extensions, modules, and platform packages
|
||||||
|
yarn run lerna:cache
|
||||||
echo 'Nothing left to see here. Go home, folks.'
|
echo 'Nothing left to see here. Go home, folks.'
|
||||||
|
|
||||||
# Build using react-scripts
|
# Build using react-scripts
|
||||||
|
|||||||
@ -122,7 +122,7 @@ window.config = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
- Install the viewer:
|
- Install the viewer:
|
||||||
`window.OHIFStandaloneViewer.installViewer(window.config);`
|
`window.OHIFViewer.installViewer(window.config);`
|
||||||
|
|
||||||
This exact setup is demonstrated in this
|
This exact setup is demonstrated in this
|
||||||
[CodeSandbox](https://codesandbox.io/s/viewer-script-tag-tprch) and in our
|
[CodeSandbox](https://codesandbox.io/s/viewer-script-tag-tprch) and in our
|
||||||
|
|||||||
@ -3,6 +3,58 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [2.8.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.8.3...@ohif/extension-cornerstone@2.8.4) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 - Put guards in all places that a cornerstone re-render ([#1899](https://github.com/OHIF/Viewers/issues/1899)) ([451f7ea](https://github.com/OHIF/Viewers/commit/451f7eab9258e7a193eb362e0926b13aedc4b3c9))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.8.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.8.2...@ohif/extension-cornerstone@2.8.3) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.8.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.8.1...@ohif/extension-cornerstone@2.8.2) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.8.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.8.0...@ohif/extension-cornerstone@2.8.1) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Infinite frame index change when quickly jumping between ([#1734](https://github.com/OHIF/Viewers/issues/1734)) ([a830577](https://github.com/OHIF/Viewers/commit/a8305772d0fbec506549ad7ea08504a8bc3a4f39)), closes [#1733](https://github.com/OHIF/Viewers/issues/1733)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [2.8.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.7.3...@ohif/extension-cornerstone@2.8.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [2.7.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.7.2...@ohif/extension-cornerstone@2.7.3) (2020-05-12)
|
## [2.7.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.7.2...@ohif/extension-cornerstone@2.7.3) (2020-05-12)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone",
|
"name": "@ohif/extension-cornerstone",
|
||||||
"version": "2.7.3",
|
"version": "2.8.4",
|
||||||
"description": "OHIF extension for Cornerstone",
|
"description": "OHIF extension for Cornerstone",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -36,7 +36,7 @@
|
|||||||
"cornerstone-math": "^0.1.8",
|
"cornerstone-math": "^0.1.8",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"cornerstone-wado-image-loader": "^3.1.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.12.3",
|
"dcmjs": "0.16.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
@ -51,6 +51,6 @@
|
|||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"lodash.merge": "^4.6.2",
|
"lodash.merge": "^4.6.2",
|
||||||
"lodash.throttle": "^4.1.1",
|
"lodash.throttle": "^4.1.1",
|
||||||
"react-cornerstone-viewport": "2.3.8"
|
"react-cornerstone-viewport": "2.3.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import ConnectedCornerstoneViewport from './ConnectedCornerstoneViewport';
|
|||||||
import OHIF from '@ohif/core';
|
import OHIF from '@ohif/core';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import cornerstone from 'cornerstone-core';
|
import cornerstone from 'cornerstone-core';
|
||||||
import debounce from 'lodash.debounce';
|
|
||||||
|
|
||||||
const { StackManager } = OHIF.utils;
|
const { StackManager } = OHIF.utils;
|
||||||
|
|
||||||
@ -216,9 +215,10 @@ class OHIFCornerstoneViewport extends Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const debouncedNewImageHandler = debounce(({ currentImageIdIndex, sopInstanceUid }) => {
|
const newImageHandler = ({ currentImageIdIndex, sopInstanceUid }) => {
|
||||||
const { displaySet } = this.props.viewportData;
|
const { displaySet } = this.props.viewportData;
|
||||||
const { StudyInstanceUID } = displaySet;
|
const { StudyInstanceUID } = displaySet;
|
||||||
|
|
||||||
if (currentImageIdIndex > 0) {
|
if (currentImageIdIndex > 0) {
|
||||||
this.props.onNewImage({
|
this.props.onNewImage({
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
@ -227,7 +227,7 @@ class OHIFCornerstoneViewport extends Component {
|
|||||||
activeViewportIndex: viewportIndex,
|
activeViewportIndex: viewportIndex,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, 700);
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -235,7 +235,8 @@ class OHIFCornerstoneViewport extends Component {
|
|||||||
viewportIndex={viewportIndex}
|
viewportIndex={viewportIndex}
|
||||||
imageIds={imageIds}
|
imageIds={imageIds}
|
||||||
imageIdIndex={currentImageIdIndex}
|
imageIdIndex={currentImageIdIndex}
|
||||||
onNewImage={debouncedNewImageHandler}
|
onNewImage={newImageHandler}
|
||||||
|
onNewImageDebounceTime={700}
|
||||||
// ~~ Connected (From REDUX)
|
// ~~ Connected (From REDUX)
|
||||||
// frameRate={frameRate}
|
// frameRate={frameRate}
|
||||||
// isPlaying={false}
|
// isPlaying={false}
|
||||||
|
|||||||
@ -10,6 +10,14 @@ const scroll = cornerstoneTools.import('util/scroll');
|
|||||||
const { studyMetadataManager } = OHIF.utils;
|
const { studyMetadataManager } = OHIF.utils;
|
||||||
const { setViewportSpecificData } = OHIF.redux.actions;
|
const { setViewportSpecificData } = OHIF.redux.actions;
|
||||||
|
|
||||||
|
const refreshCornerstoneViewports = () => {
|
||||||
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
if (enabledElement.image) {
|
||||||
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const commandsModule = ({ servicesManager }) => {
|
const commandsModule = ({ servicesManager }) => {
|
||||||
const actions = {
|
const actions = {
|
||||||
rotateViewport: ({ viewports, rotation }) => {
|
rotateViewport: ({ viewports, rotation }) => {
|
||||||
@ -180,10 +188,7 @@ const commandsModule = ({ servicesManager }) => {
|
|||||||
|
|
||||||
measurementApi.syncMeasurementsAndToolData();
|
measurementApi.syncMeasurementsAndToolData();
|
||||||
|
|
||||||
// Update images in all active viewports
|
refreshCornerstoneViewports();
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
|
||||||
cornerstone.updateImage(enabledElement.element);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
getNearbyToolData({ element, canvasCoordinates, availableToolTypes }) {
|
getNearbyToolData({ element, canvasCoordinates, availableToolTypes }) {
|
||||||
const nearbyTool = {};
|
const nearbyTool = {};
|
||||||
@ -262,23 +267,26 @@ const commandsModule = ({ servicesManager }) => {
|
|||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
SOPInstanceUID,
|
SOPInstanceUID,
|
||||||
frameIndex,
|
frameIndex,
|
||||||
activeViewportIndex
|
activeViewportIndex,
|
||||||
}) => {
|
}) => {
|
||||||
const study = studyMetadataManager.get(StudyInstanceUID);
|
const study = studyMetadataManager.get(StudyInstanceUID);
|
||||||
|
|
||||||
const displaySet = study.findDisplaySet(ds => {
|
const displaySet = study.findDisplaySet(ds => {
|
||||||
return ds.images && ds.images.find(i => i.getSOPInstanceUID() === SOPInstanceUID)
|
return (
|
||||||
|
ds.images &&
|
||||||
|
ds.images.find(i => i.getSOPInstanceUID() === SOPInstanceUID)
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
displaySet.SOPInstanceUID = SOPInstanceUID;
|
displaySet.SOPInstanceUID = SOPInstanceUID;
|
||||||
displaySet.frameIndex = frameIndex;
|
displaySet.frameIndex = frameIndex;
|
||||||
|
|
||||||
window.store.dispatch(setViewportSpecificData(activeViewportIndex, displaySet));
|
window.store.dispatch(
|
||||||
|
setViewportSpecificData(activeViewportIndex, displaySet)
|
||||||
|
);
|
||||||
|
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
refreshCornerstoneViewports();
|
||||||
cornerstone.updateImage(enabledElement.element);
|
},
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const definitions = {
|
const definitions = {
|
||||||
|
|||||||
@ -39,7 +39,9 @@ export default {
|
|||||||
const onNewImageHandler = jumpData => {
|
const onNewImageHandler = jumpData => {
|
||||||
commandsManager.runCommand('jumpToImage', jumpData);
|
commandsManager.runCommand('jumpToImage', jumpData);
|
||||||
};
|
};
|
||||||
return <OHIFCornerstoneViewport {...props} onNewImage={onNewImageHandler} />;
|
return (
|
||||||
|
<OHIFCornerstoneViewport {...props} onNewImage={onNewImageHandler} />
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return ExtendedOHIFCornerstoneViewport;
|
return ExtendedOHIFCornerstoneViewport;
|
||||||
|
|||||||
@ -3,6 +3,25 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.2.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.3...@ohif/extension-dicom-html@1.2.4) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.2.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.2...@ohif/extension-dicom-html@1.2.3) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [1.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.1...@ohif/extension-dicom-html@1.2.2) (2020-05-04)
|
## [1.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.1...@ohif/extension-dicom-html@1.2.2) (2020-05-04)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-html",
|
"name": "@ohif/extension-dicom-html",
|
||||||
"version": "1.2.2",
|
"version": "1.2.4",
|
||||||
"description": "OHIF extension for rendering structured reports to HTML",
|
"description": "OHIF extension for rendering structured reports to HTML",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "^0.50.0",
|
"@ohif/core": "^0.50.0",
|
||||||
"dcmjs": "^0.12.3",
|
"dcmjs": "0.16.0",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
"react": "^16.8.6",
|
"react": "^16.8.6",
|
||||||
"react-dom": "^16.8.6"
|
"react-dom": "^16.8.6"
|
||||||
|
|||||||
@ -3,6 +3,17 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [0.51.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.9...@ohif/extension-dicom-microscopy@0.51.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [0.50.9](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.8...@ohif/extension-dicom-microscopy@0.50.9) (2020-04-02)
|
## [0.50.9](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.8...@ohif/extension-dicom-microscopy@0.50.9) (2020-04-02)
|
||||||
|
|
||||||
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-microscopy",
|
"name": "@ohif/extension-dicom-microscopy",
|
||||||
"version": "0.50.9",
|
"version": "0.51.0",
|
||||||
"description": "OHIF extension for Dicom Microscopy",
|
"description": "OHIF extension for Dicom Microscopy",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@ -3,6 +3,22 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [0.1.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-p10-downloader@0.1.1...@ohif/extension-dicom-p10-downloader@0.1.2) (2020-06-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-p10-downloader
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.1.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-p10-downloader@0.1.0...@ohif/extension-dicom-p10-downloader@0.1.1) (2020-06-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-p10-downloader
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [0.1.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-p10-downloader@0.0.2...@ohif/extension-dicom-p10-downloader@0.1.0) (2020-04-23)
|
# [0.1.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-p10-downloader@0.0.2...@ohif/extension-dicom-p10-downloader@0.1.0) (2020-04-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-p10-downloader",
|
"name": "@ohif/extension-dicom-p10-downloader",
|
||||||
"version": "0.1.0",
|
"version": "0.1.2",
|
||||||
"description": "OHIF extension for downloading DICOM P10 files",
|
"description": "OHIF extension for downloading DICOM P10 files",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@ -1,16 +1,16 @@
|
|||||||
import OHIF from '@ohif/core';
|
import OHIF from '@ohif/core';
|
||||||
import {
|
import {
|
||||||
save,
|
save,
|
||||||
|
upload,
|
||||||
getDicomWebClientFromContext,
|
getDicomWebClientFromContext,
|
||||||
|
getStudyInstanceUIDFromStudies,
|
||||||
getSOPInstanceReferenceFromActiveViewport,
|
getSOPInstanceReferenceFromActiveViewport,
|
||||||
getSOPInstanceReferencesFromViewports,
|
getSOPInstanceReferencesFromViewports,
|
||||||
} from './utils';
|
} from './utils';
|
||||||
import _downloadAndZip from './downloadAndZip';
|
import _downloadAndZip, { downloadInstances } from './downloadAndZip';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
utils: {
|
utils: { Queue },
|
||||||
Queue,
|
|
||||||
},
|
|
||||||
} = OHIF;
|
} = OHIF;
|
||||||
|
|
||||||
export function getCommands(context) {
|
export function getCommands(context) {
|
||||||
@ -41,6 +41,14 @@ export function getCommands(context) {
|
|||||||
listOfUIDs
|
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 }) {
|
downloadAndZipSeriesOnViewports({ servers, viewports, progress }) {
|
||||||
const dicomWebClient = getDicomWebClientFromContext(context, servers);
|
const dicomWebClient = getDicomWebClientFromContext(context, servers);
|
||||||
const listOfUIDs = getSOPInstanceReferencesFromViewports(viewports);
|
const listOfUIDs = getSOPInstanceReferencesFromViewports(viewports);
|
||||||
@ -57,6 +65,28 @@ export function getCommands(context) {
|
|||||||
listOfUIDs
|
listOfUIDs
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
downloadAndUploadStudy({ servers, studies, progress, serverConfig }) {
|
||||||
|
const dicomWebClient = getDicomWebClientFromContext(context, servers);
|
||||||
|
const listOfUIDs = getStudyInstanceUIDFromStudies(studies);
|
||||||
|
return upload(
|
||||||
|
downloadInstances(dicomWebClient, listOfUIDs, { progress }),
|
||||||
|
/**
|
||||||
|
* serverConfig is an object with the values used to create a new
|
||||||
|
* instance of DICOMwebClient.
|
||||||
|
*
|
||||||
|
* Basic Structure:
|
||||||
|
*
|
||||||
|
* const config = {
|
||||||
|
* url,
|
||||||
|
* headers,
|
||||||
|
* errorInterceptor
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* const dicomWeb = new api.DICOMwebClient(config);
|
||||||
|
*/
|
||||||
|
serverConfig
|
||||||
|
);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const definitions = {
|
const definitions = {
|
||||||
@ -64,6 +94,11 @@ export function getCommands(context) {
|
|||||||
commandFn: queue.bindSafe(actions.downloadAndZip, error),
|
commandFn: queue.bindSafe(actions.downloadAndZip, error),
|
||||||
storeContexts: ['servers'],
|
storeContexts: ['servers'],
|
||||||
},
|
},
|
||||||
|
downloadAndZipStudy: {
|
||||||
|
commandFn: queue.bindSafe(actions.downloadAndZipStudy, error),
|
||||||
|
storeContexts: ['servers', 'studies'],
|
||||||
|
options: { progress },
|
||||||
|
},
|
||||||
downloadAndZipSeriesOnViewports: {
|
downloadAndZipSeriesOnViewports: {
|
||||||
commandFn: queue.bindSafe(actions.downloadAndZipSeriesOnViewports, error),
|
commandFn: queue.bindSafe(actions.downloadAndZipSeriesOnViewports, error),
|
||||||
storeContexts: ['servers', 'viewports'],
|
storeContexts: ['servers', 'viewports'],
|
||||||
@ -77,6 +112,11 @@ export function getCommands(context) {
|
|||||||
storeContexts: ['servers', 'viewports'],
|
storeContexts: ['servers', 'viewports'],
|
||||||
options: { progress },
|
options: { progress },
|
||||||
},
|
},
|
||||||
|
downloadAndUploadStudy: {
|
||||||
|
commandFn: queue.bindSafe(actions.downloadAndUploadStudy, error),
|
||||||
|
storeContexts: ['servers', 'studies'],
|
||||||
|
options: { progress },
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -78,6 +78,25 @@ const {
|
|||||||
async function downloadAndZip(dicomWebClient, listOfUIDs, options) {
|
async function downloadAndZip(dicomWebClient, listOfUIDs, options) {
|
||||||
if (dicomWebClient instanceof api.DICOMwebClient) {
|
if (dicomWebClient instanceof api.DICOMwebClient) {
|
||||||
const settings = buildSettings(listOfUIDs, options);
|
const settings = buildSettings(listOfUIDs, options);
|
||||||
|
const { compression } = settings.tasks;
|
||||||
|
const buffers = await downloadBuffers(settings, dicomWebClient);
|
||||||
|
compression.deferred.resolve(zipAll(buffers, settings));
|
||||||
|
const url = await compression.deferred.promise;
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
throw new Error('A valid DICOM Web Client instance is expected');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadInstances(dicomWebClient, listOfUIDs, options) {
|
||||||
|
if (dicomWebClient instanceof api.DICOMwebClient) {
|
||||||
|
const settings = buildSettings(listOfUIDs, options);
|
||||||
|
const buffers = await downloadBuffers(settings, dicomWebClient);
|
||||||
|
return buffers;
|
||||||
|
}
|
||||||
|
throw new Error('A valid DICOM Web Client instance is expected');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadBuffers(settings, dicomWebClient) {
|
||||||
const { compression } = settings.tasks;
|
const { compression } = settings.tasks;
|
||||||
// Register user-provided progress handler as a task list observer
|
// Register user-provided progress handler as a task list observer
|
||||||
progressUtils.addObserver(settings.taskList, settings.options.progress);
|
progressUtils.addObserver(settings.taskList, settings.options.progress);
|
||||||
@ -86,11 +105,7 @@ async function downloadAndZip(dicomWebClient, listOfUIDs, options) {
|
|||||||
compression.deferred.reject(error);
|
compression.deferred.reject(error);
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
compression.deferred.resolve(zipAll(buffers, settings));
|
return buffers;
|
||||||
const url = await compression.deferred.promise;
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
throw new Error('A valid DICOM Web Client instance is expected');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -241,4 +256,4 @@ async function download(
|
|||||||
* Exports
|
* Exports
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export { downloadAndZip as default, downloadAndZip };
|
export { downloadAndZip as default, downloadAndZip, downloadInstances };
|
||||||
|
|||||||
@ -100,11 +100,59 @@ function save(promise, listOfUIDs) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function upload(promise, serverConfig) {
|
||||||
|
return Promise.resolve(promise)
|
||||||
|
.then(async instances => {
|
||||||
|
const instancesAmount = instances.length;
|
||||||
|
OHIF.log.info(`Uploading study to ${serverConfig.url}`);
|
||||||
|
OHIF.log.info(
|
||||||
|
`${instancesAmount} instances are being uploaded. Don't close your browser.`
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const dicomWeb = new api.DICOMwebClient(serverConfig);
|
||||||
|
let progress = 0;
|
||||||
|
|
||||||
|
const getProgress = () => {
|
||||||
|
return ((progress * 100) / instancesAmount).toFixed();
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const instance of instances) {
|
||||||
|
const options = {
|
||||||
|
datasets: [instance],
|
||||||
|
};
|
||||||
|
|
||||||
|
await dicomWeb.storeInstances(options);
|
||||||
|
|
||||||
|
progress++;
|
||||||
|
|
||||||
|
OHIF.log.info(`Progress: ${getProgress()}%`);
|
||||||
|
}
|
||||||
|
|
||||||
|
OHIF.log.info('Successfully uploaded!');
|
||||||
|
} catch (error) {
|
||||||
|
OHIF.log.error(`Failed to upload: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return instances;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
OHIF.log.error(`Failed to upload: ${error}`);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStudyInstanceUIDFromStudies(studies) {
|
||||||
|
return Object.keys(Object(Object(studies).studyData)).slice(0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
save,
|
save,
|
||||||
|
upload,
|
||||||
validDicomUid,
|
validDicomUid,
|
||||||
getDicomWebClientFromConfig,
|
getDicomWebClientFromConfig,
|
||||||
getDicomWebClientFromContext,
|
getDicomWebClientFromContext,
|
||||||
|
getStudyInstanceUIDFromStudies,
|
||||||
getSOPInstanceReferenceFromActiveViewport,
|
getSOPInstanceReferenceFromActiveViewport,
|
||||||
getSOPInstanceReferencesFromViewports,
|
getSOPInstanceReferencesFromViewports,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -3,6 +3,66 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [0.2.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.2.4...@ohif/extension-dicom-rt@0.2.5) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 - Put guards in all places that a cornerstone re-render ([#1899](https://github.com/OHIF/Viewers/issues/1899)) ([451f7ea](https://github.com/OHIF/Viewers/commit/451f7eab9258e7a193eb362e0926b13aedc4b3c9))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.2.3...@ohif/extension-dicom-rt@0.2.4) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.2.2...@ohif/extension-dicom-rt@0.2.3) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.2.1...@ohif/extension-dicom-rt@0.2.2) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix RT Panel hide/show and Fix looping load errors ([#1877](https://github.com/OHIF/Viewers/issues/1877)) ([e7cc735](https://github.com/OHIF/Viewers/commit/e7cc735c03d02eeb0d3af4ba02c15ed4f81bbec2))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.2.0...@ohif/extension-dicom-rt@0.2.1) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [0.2.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.4...@ohif/extension-dicom-rt@0.2.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [0.1.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.3...@ohif/extension-dicom-rt@0.1.4) (2020-05-14)
|
## [0.1.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.3...@ohif/extension-dicom-rt@0.1.4) (2020-05-14)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-rt",
|
"name": "@ohif/extension-dicom-rt",
|
||||||
"version": "0.1.4",
|
"version": "0.2.5",
|
||||||
"description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.",
|
"description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -31,7 +31,7 @@
|
|||||||
"@ohif/core": "^0.50.0",
|
"@ohif/core": "^0.50.0",
|
||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"dcmjs": "^0.12.3",
|
"dcmjs": "0.16.0",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
"react": "^16.8.6",
|
"react": "^16.8.6",
|
||||||
"react-dom": "^16.8.6"
|
"react-dom": "^16.8.6"
|
||||||
|
|||||||
@ -74,6 +74,7 @@ const OHIFDicomRTStructSopClassHandler = {
|
|||||||
studies
|
studies
|
||||||
).catch(error => {
|
).catch(error => {
|
||||||
rtStructDisplaySet.isLoaded = false;
|
rtStructDisplaySet.isLoaded = false;
|
||||||
|
rtStructDisplaySet.loadError = true;
|
||||||
throw new Error(error);
|
throw new Error(error);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,7 +17,10 @@ const { studyMetadataManager } = utils;
|
|||||||
|
|
||||||
const refreshViewport = () => {
|
const refreshViewport = () => {
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
debugger;
|
||||||
|
if (enabledElement.image) {
|
||||||
cornerstone.updateImage(enabledElement.element);
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -31,7 +34,19 @@ const refreshViewport = () => {
|
|||||||
* @param {number} props.isOpen - isOpen
|
* @param {number} props.isOpen - isOpen
|
||||||
* @returns component
|
* @returns component
|
||||||
*/
|
*/
|
||||||
const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }) => {
|
const RTPanel = ({
|
||||||
|
studies,
|
||||||
|
viewports,
|
||||||
|
activeIndex,
|
||||||
|
isOpen,
|
||||||
|
onContourItemClick,
|
||||||
|
noContoursNotification,
|
||||||
|
activeContexts = [],
|
||||||
|
contexts = {},
|
||||||
|
}) => {
|
||||||
|
const isVTK = () => activeContexts.includes(contexts.VTK);
|
||||||
|
const isCornerstone = () => activeContexts.includes(contexts.CORNERSTONE);
|
||||||
|
|
||||||
const [selectedContour, setSelectedContour] = useState();
|
const [selectedContour, setSelectedContour] = useState();
|
||||||
const DEFAULT_SET_INDEX = 0;
|
const DEFAULT_SET_INDEX = 0;
|
||||||
const DEFAULT_STATE = {
|
const DEFAULT_STATE = {
|
||||||
@ -65,7 +80,10 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
document.addEventListener('extensiondicomrtrtloaded', updateStructureSets);
|
document.addEventListener('extensiondicomrtrtloaded', updateStructureSets);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
document.removeEventListener('extensiondicomrtrtloaded', updateStructureSets);
|
document.removeEventListener(
|
||||||
|
'extensiondicomrtrtloaded',
|
||||||
|
updateStructureSets
|
||||||
|
);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
@ -78,7 +96,9 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
activeViewport.SeriesInstanceUID
|
activeViewport.SeriesInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
const studyMetadata = studyMetadataManager.get(activeViewport.StudyInstanceUID);
|
const studyMetadata = studyMetadataManager.get(
|
||||||
|
activeViewport.StudyInstanceUID
|
||||||
|
);
|
||||||
const referencedDisplaysets = studyMetadata.getDerivedDatasets({
|
const referencedDisplaysets = studyMetadata.getDerivedDatasets({
|
||||||
referencedSeriesInstanceUID: activeViewport.SeriesInstanceUID,
|
referencedSeriesInstanceUID: activeViewport.SeriesInstanceUID,
|
||||||
Modality: 'RTSTRUCT',
|
Modality: 'RTSTRUCT',
|
||||||
@ -89,7 +109,7 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
setState({
|
setState({
|
||||||
referencedDisplaysets,
|
referencedDisplaysets,
|
||||||
selectedSet: defaultSet,
|
selectedSet: defaultSet,
|
||||||
sets: viewportSets
|
sets: viewportSets,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
setState(DEFAULT_STATE);
|
setState(DEFAULT_STATE);
|
||||||
@ -105,7 +125,10 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
setShowSettings(showSettings && !isOpen);
|
setShowSettings(showSettings && !isOpen);
|
||||||
}, [isOpen]);
|
}, [isOpen]);
|
||||||
|
|
||||||
const toContourItem = ({ ROINumber, ROIName, RTROIObservations, colorArray, visible }, loadedSet) => {
|
const toContourItem = (
|
||||||
|
{ ROINumber, ROIName, RTROIObservations, colorArray, visible },
|
||||||
|
loadedSet
|
||||||
|
) => {
|
||||||
let interpretedType = '';
|
let interpretedType = '';
|
||||||
if (RTROIObservations && RTROIObservations.RTROIInterpretedType) {
|
if (RTROIObservations && RTROIObservations.RTROIInterpretedType) {
|
||||||
interpretedType = `(${RTROIObservations.RTROIInterpretedType})`;
|
interpretedType = `(${RTROIObservations.RTROIInterpretedType})`;
|
||||||
@ -119,6 +142,7 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setSelectedContour(isSameContour ? null : ROINumber);
|
setSelectedContour(isSameContour ? null : ROINumber);
|
||||||
|
|
||||||
|
if (isCornerstone()) {
|
||||||
const enabledElements = cornerstone.getEnabledElements();
|
const enabledElements = cornerstone.getEnabledElements();
|
||||||
const element = enabledElements[activeIndex].element;
|
const element = enabledElements[activeIndex].element;
|
||||||
const toolState = cornerstoneTools.getToolState(element, 'stack');
|
const toolState = cornerstoneTools.getToolState(element, 'stack');
|
||||||
@ -136,16 +160,29 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
imageIds
|
imageIds
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (!imageId) {
|
||||||
|
noContoursNotification();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const frameIndex = imageIds.indexOf(imageId);
|
const frameIndex = imageIds.indexOf(imageId);
|
||||||
const SOPInstanceUID = cornerstone.metaData.get('SOPInstanceUID', imageId);
|
const SOPInstanceUID = cornerstone.metaData.get(
|
||||||
const StudyInstanceUID = cornerstone.metaData.get('StudyInstanceUID', imageId);
|
'SOPInstanceUID',
|
||||||
|
imageId
|
||||||
|
);
|
||||||
|
const StudyInstanceUID = cornerstone.metaData.get(
|
||||||
|
'StudyInstanceUID',
|
||||||
|
imageId
|
||||||
|
);
|
||||||
|
|
||||||
onContourItemClick({
|
onContourItemClick({
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
SOPInstanceUID,
|
SOPInstanceUID,
|
||||||
frameIndex,
|
frameIndex,
|
||||||
activeViewportIndex: activeIndex
|
activeViewportIndex: activeIndex,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
label={`${ROIName} ${interpretedType}`}
|
label={`${ROIName} ${interpretedType}`}
|
||||||
index={ROINumber}
|
index={ROINumber}
|
||||||
@ -153,7 +190,10 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
visible={visible}
|
visible={visible}
|
||||||
onVisibilityChange={() => {
|
onVisibilityChange={() => {
|
||||||
const module = cornerstoneTools.getModule('rtstruct');
|
const module = cornerstoneTools.getModule('rtstruct');
|
||||||
module.setters.toggleROIContour(state.selectedSet.SeriesInstanceUID, ROINumber);
|
module.setters.toggleROIContour(
|
||||||
|
state.selectedSet.SeriesInstanceUID,
|
||||||
|
ROINumber
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@ -189,14 +229,21 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
onClick={() => setShowSettings(true)}
|
onClick={() => setShowSettings(true)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{!state.referencedDisplaysets.length && <LoadingIndicator expand height="70px" width="70px" />}
|
{!state.referencedDisplaysets.length && (
|
||||||
{state.sets && state.referencedDisplaysets.map(displaySet => {
|
<LoadingIndicator expand height="70px" width="70px" />
|
||||||
|
)}
|
||||||
|
{state.sets &&
|
||||||
|
state.referencedDisplaysets.map(displaySet => {
|
||||||
const { SeriesInstanceUID, metadata, isLoaded } = displaySet;
|
const { SeriesInstanceUID, metadata, isLoaded } = displaySet;
|
||||||
|
|
||||||
const module = cornerstoneTools.getModule('rtstruct');
|
const module = cornerstoneTools.getModule('rtstruct');
|
||||||
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(viewports[activeIndex].SeriesInstanceUID);
|
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(
|
||||||
|
viewports[activeIndex].SeriesInstanceUID
|
||||||
|
);
|
||||||
|
|
||||||
const loadedSet = sets.find(set => set.SeriesInstanceUID === SeriesInstanceUID);
|
const loadedSet = sets.find(
|
||||||
|
set => set.SeriesInstanceUID === SeriesInstanceUID
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<PanelSection
|
<PanelSection
|
||||||
key={SeriesInstanceUID}
|
key={SeriesInstanceUID}
|
||||||
@ -204,13 +251,22 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
loading={!isLoaded || !loadedSet}
|
loading={!isLoaded || !loadedSet}
|
||||||
visible={isLoaded && loadedSet.visible}
|
visible={isLoaded && loadedSet.visible}
|
||||||
hideVisibleButton={!isLoaded}
|
hideVisibleButton={!isLoaded}
|
||||||
expanded={isLoaded && loadedSet.SeriesInstanceUID === state.selectedSet.SeriesInstanceUID}
|
expanded={
|
||||||
|
isLoaded &&
|
||||||
|
loadedSet.SeriesInstanceUID ===
|
||||||
|
state.selectedSet.SeriesInstanceUID
|
||||||
|
}
|
||||||
onVisibilityChange={newVisibility => {
|
onVisibilityChange={newVisibility => {
|
||||||
const module = cornerstoneTools.getModule('rtstruct');
|
const module = cornerstoneTools.getModule('rtstruct');
|
||||||
loadedSet.ROIContours.forEach(({ ROINumber }) => {
|
|
||||||
module.setters.toggleROIContour(loadedSet.SeriesInstanceUID, ROINumber);
|
if (newVisibility) {
|
||||||
});
|
module.setters.showStructureSet(loadedSet.SeriesInstanceUID);
|
||||||
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(viewports[activeIndex].SeriesInstanceUID);
|
} else {
|
||||||
|
module.setters.hideStructureSet(loadedSet.SeriesInstanceUID);
|
||||||
|
}
|
||||||
|
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(
|
||||||
|
viewports[activeIndex].SeriesInstanceUID
|
||||||
|
);
|
||||||
setState(state => ({ ...state, sets }));
|
setState(state => ({ ...state, sets }));
|
||||||
refreshViewport();
|
refreshViewport();
|
||||||
}}
|
}}
|
||||||
@ -218,15 +274,20 @@ const RTPanel = ({ studies, viewports, activeIndex, isOpen, onContourItemClick }
|
|||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
await displaySet.load(viewports[activeIndex], studies);
|
await displaySet.load(viewports[activeIndex], studies);
|
||||||
const module = cornerstoneTools.getModule('rtstruct');
|
const module = cornerstoneTools.getModule('rtstruct');
|
||||||
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(viewports[activeIndex].SeriesInstanceUID);
|
const sets = module.getters.structuresSetsWhichReferenceSeriesInstanceUid(
|
||||||
const selectedSet = sets.find(set => set.SeriesInstanceUID === SeriesInstanceUID);
|
viewports[activeIndex].SeriesInstanceUID
|
||||||
|
);
|
||||||
|
const selectedSet = sets.find(
|
||||||
|
set => set.SeriesInstanceUID === SeriesInstanceUID
|
||||||
|
);
|
||||||
setState(state => ({ ...state, selectedSet, sets }));
|
setState(state => ({ ...state, selectedSet, sets }));
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ScrollableArea>
|
<ScrollableArea>
|
||||||
<TableList headless>
|
<TableList headless>
|
||||||
{isLoaded && loadedSet.ROIContours.map(c => toContourItem(c, loadedSet))}
|
{isLoaded &&
|
||||||
|
loadedSet.ROIContours.map(c => toContourItem(c, loadedSet))}
|
||||||
</TableList>
|
</TableList>
|
||||||
</ScrollableArea>
|
</ScrollableArea>
|
||||||
</PanelSection>
|
</PanelSection>
|
||||||
|
|||||||
@ -20,14 +20,33 @@ export default {
|
|||||||
preRegistration({ servicesManager, configuration = {} }) {
|
preRegistration({ servicesManager, configuration = {} }) {
|
||||||
init({ servicesManager, configuration });
|
init({ servicesManager, configuration });
|
||||||
},
|
},
|
||||||
getPanelModule({ commandsManager }) {
|
getPanelModule({ commandsManager, servicesManager, api }) {
|
||||||
|
const { UINotificationService } = servicesManager.services;
|
||||||
|
|
||||||
const ExtendedRTPanel = props => {
|
const ExtendedRTPanel = props => {
|
||||||
|
const { activeContexts } = api.hooks.useAppContext();
|
||||||
|
|
||||||
|
const noContoursNotificationHandler = () => {
|
||||||
|
UINotificationService.show({
|
||||||
|
title: 'ROI Contour empty',
|
||||||
|
message: 'The ROI contour has no structure set data.',
|
||||||
|
type: 'error',
|
||||||
|
autoClose: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const contourItemClickHandler = contourData => {
|
const contourItemClickHandler = contourData => {
|
||||||
commandsManager.runCommand('jumpToImage', contourData);
|
commandsManager.runCommand('jumpToImage', contourData);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RTPanel {...props} onContourItemClick={contourItemClickHandler} />
|
<RTPanel
|
||||||
|
{...props}
|
||||||
|
onContourItemClick={contourItemClickHandler}
|
||||||
|
activeContexts={activeContexts}
|
||||||
|
contexts={api.contexts}
|
||||||
|
noContoursNotification={noContoursNotificationHandler}
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,6 @@ export default async function loadRTStruct(
|
|||||||
studies
|
studies
|
||||||
) {
|
) {
|
||||||
const rtStructModule = cornerstoneTools.getModule('rtstruct');
|
const rtStructModule = cornerstoneTools.getModule('rtstruct');
|
||||||
|
|
||||||
// Set here is loading is asynchronous.
|
// Set here is loading is asynchronous.
|
||||||
// If this function throws its set back to false.
|
// If this function throws its set back to false.
|
||||||
rtStructDisplaySet.isLoaded = true;
|
rtStructDisplaySet.isLoaded = true;
|
||||||
@ -68,7 +67,6 @@ export default async function loadRTStruct(
|
|||||||
const rtStructDisplayToolName = TOOL_NAMES.RTSTRUCT_DISPLAY_TOOL;
|
const rtStructDisplayToolName = TOOL_NAMES.RTSTRUCT_DISPLAY_TOOL;
|
||||||
|
|
||||||
for (let i = 0; i < ROIContourSequence.length; i++) {
|
for (let i = 0; i < ROIContourSequence.length; i++) {
|
||||||
|
|
||||||
const ROIContour = ROIContourSequence[i];
|
const ROIContour = ROIContourSequence[i];
|
||||||
const { ReferencedROINumber, ContourSequence } = ROIContour;
|
const { ReferencedROINumber, ContourSequence } = ROIContour;
|
||||||
|
|
||||||
@ -238,7 +236,7 @@ function _setROIContourRTROIObservations(
|
|||||||
|
|
||||||
function _setToolEnabledIfNotEnabled(toolName) {
|
function _setToolEnabledIfNotEnabled(toolName) {
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
const { element } = enabledElement;
|
const { element, image } = enabledElement;
|
||||||
const tool = cornerstoneTools.getToolForElement(element, toolName);
|
const tool = cornerstoneTools.getToolForElement(element, toolName);
|
||||||
|
|
||||||
if (tool.mode !== 'enabled') {
|
if (tool.mode !== 'enabled') {
|
||||||
@ -246,7 +244,9 @@ function _setToolEnabledIfNotEnabled(toolName) {
|
|||||||
cornerstoneTools.setToolEnabled(toolName);
|
cornerstoneTools.setToolEnabled(toolName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (image) {
|
||||||
cornerstone.updateImage(element);
|
cornerstone.updateImage(element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,9 @@ import structureSetReferencesSeriesInstanceUid from './lib/structureSetReference
|
|||||||
// We should put this as a helper somewhere as we are using it in mutliple places.
|
// We should put this as a helper somewhere as we are using it in mutliple places.
|
||||||
function refreshViewport() {
|
function refreshViewport() {
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
if (enabledElement.image) {
|
||||||
cornerstone.updateImage(enabledElement.element);
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +83,9 @@ function _setStructureSetVisible(SeriesInstanceUID, visible = true) {
|
|||||||
const StructureSet = getStructureSet(SeriesInstanceUID);
|
const StructureSet = getStructureSet(SeriesInstanceUID);
|
||||||
|
|
||||||
if (StructureSet) {
|
if (StructureSet) {
|
||||||
StructureSet.visible = visible;
|
StructureSet.ROIContours.forEach(ROIContour => {
|
||||||
|
ROIContour.visible = visible;
|
||||||
|
});
|
||||||
|
|
||||||
refreshViewport();
|
refreshViewport();
|
||||||
}
|
}
|
||||||
@ -154,15 +158,10 @@ function setToggleROIContour(SeriesInstanceUID, ROINumber) {
|
|||||||
* Returns an array of StructureSets which reference the given SeriesInstanceUID.
|
* Returns an array of StructureSets which reference the given SeriesInstanceUID.
|
||||||
* @param {string} SeriesInstanceUID The SeriesInstanceUID to check.
|
* @param {string} SeriesInstanceUID The SeriesInstanceUID to check.
|
||||||
*/
|
*/
|
||||||
function getStructuresSetsWhichReferenceSeriesInstanceUid(
|
function getStructuresSetsWhichReferenceSeriesInstanceUid(SeriesInstanceUID) {
|
||||||
SeriesInstanceUID
|
|
||||||
) {
|
|
||||||
const { StructureSets } = state;
|
const { StructureSets } = state;
|
||||||
return StructureSets.filter(StructureSet =>
|
return StructureSets.filter(StructureSet =>
|
||||||
structureSetReferencesSeriesInstanceUid(
|
structureSetReferencesSeriesInstanceUid(StructureSet, SeriesInstanceUID)
|
||||||
StructureSet,
|
|
||||||
SeriesInstanceUID
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,47 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [0.3.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.3.2...@ohif/extension-dicom-segmentation@0.3.3) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.3.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.3.1...@ohif/extension-dicom-segmentation@0.3.2) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix RT Panel hide/show and Fix looping load errors ([#1877](https://github.com/OHIF/Viewers/issues/1877)) ([e7cc735](https://github.com/OHIF/Viewers/commit/e7cc735c03d02eeb0d3af4ba02c15ed4f81bbec2))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [0.3.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.3.0...@ohif/extension-dicom-segmentation@0.3.1) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [0.3.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.6...@ohif/extension-dicom-segmentation@0.3.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [0.2.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.5...@ohif/extension-dicom-segmentation@0.2.6) (2020-05-12)
|
## [0.2.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.5...@ohif/extension-dicom-segmentation@0.2.6) (2020-05-12)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-segmentation",
|
"name": "@ohif/extension-dicom-segmentation",
|
||||||
"version": "0.2.6",
|
"version": "0.3.3",
|
||||||
"description": "OHIF extension for viewing segmentations in the 2D MPR view",
|
"description": "OHIF extension for viewing segmentations in the 2D MPR view",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -31,7 +31,7 @@
|
|||||||
"@ohif/core": "^0.50.0",
|
"@ohif/core": "^0.50.0",
|
||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"dcmjs": "^0.12.2",
|
"dcmjs": "0.16.0",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
"react": "^16.8.6",
|
"react": "^16.8.6",
|
||||||
"react-dom": "^16.8.6"
|
"react-dom": "^16.8.6"
|
||||||
|
|||||||
@ -8,6 +8,11 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dcmseg-segmentation-panel.disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
.dcmseg-segmentation-panel h3 {
|
.dcmseg-segmentation-panel h3 {
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
|
|||||||
@ -49,8 +49,8 @@ const SegmentationPanel = ({
|
|||||||
onConfigurationChange,
|
onConfigurationChange,
|
||||||
onDisplaySetLoadFailure,
|
onDisplaySetLoadFailure,
|
||||||
onSelectedSegmentationChange,
|
onSelectedSegmentationChange,
|
||||||
activeContexts,
|
activeContexts = [],
|
||||||
contexts,
|
contexts = {},
|
||||||
}) => {
|
}) => {
|
||||||
const isVTK = () => activeContexts.includes(contexts.VTK);
|
const isVTK = () => activeContexts.includes(contexts.VTK);
|
||||||
const isCornerstone = () => activeContexts.includes(contexts.CORNERSTONE);
|
const isCornerstone = () => activeContexts.includes(contexts.CORNERSTONE);
|
||||||
@ -77,7 +77,8 @@ const SegmentationPanel = ({
|
|||||||
labelmapList: [],
|
labelmapList: [],
|
||||||
segmentList: [],
|
segmentList: [],
|
||||||
cachedSegmentsProperties: [],
|
cachedSegmentsProperties: [],
|
||||||
isLoading: false
|
isLoading: false,
|
||||||
|
isDisabled: true
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -139,6 +140,9 @@ const SegmentationPanel = ({
|
|||||||
const refreshSegmentations = useCallback(() => {
|
const refreshSegmentations = useCallback(() => {
|
||||||
const module = cornerstoneTools.getModule('segmentation');
|
const module = cornerstoneTools.getModule('segmentation');
|
||||||
const activeViewport = viewports[activeIndex];
|
const activeViewport = viewports[activeIndex];
|
||||||
|
|
||||||
|
const isDisabled = !activeViewport || !activeViewport.StudyInstanceUID;
|
||||||
|
if (!isDisabled) {
|
||||||
const studyMetadata = studyMetadataManager.get(
|
const studyMetadata = studyMetadataManager.get(
|
||||||
activeViewport.StudyInstanceUID
|
activeViewport.StudyInstanceUID
|
||||||
);
|
);
|
||||||
@ -165,14 +169,17 @@ const SegmentationPanel = ({
|
|||||||
selectedSegmentation: brushStackState.activeLabelmapIndex,
|
selectedSegmentation: brushStackState.activeLabelmapIndex,
|
||||||
labelmapList,
|
labelmapList,
|
||||||
segmentList,
|
segmentList,
|
||||||
|
isDisabled
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
setState(state => ({
|
setState(state => ({
|
||||||
...state,
|
...state,
|
||||||
labelmapList: [],
|
labelmapList: [],
|
||||||
segmentList: [],
|
segmentList: [],
|
||||||
|
isDisabled
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}, [
|
}, [
|
||||||
viewports,
|
viewports,
|
||||||
activeIndex,
|
activeIndex,
|
||||||
@ -181,7 +188,7 @@ const SegmentationPanel = ({
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
refreshSegmentations();
|
refreshSegmentations();
|
||||||
}, [viewports, activeIndex, state.selectedSegmentation, activeContexts, state.isLoading]);
|
}, [viewports, activeIndex, isOpen, state.selectedSegmentation, activeContexts, state.isLoading]);
|
||||||
|
|
||||||
/* Handle open/closed panel behaviour */
|
/* Handle open/closed panel behaviour */
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -507,7 +514,7 @@ const SegmentationPanel = ({
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<div className="dcmseg-segmentation-panel">
|
<div className={`dcmseg-segmentation-panel ${state.isDisabled && 'disabled'}`}>
|
||||||
<Icon
|
<Icon
|
||||||
className="cog-icon"
|
className="cog-icon"
|
||||||
name="cog"
|
name="cog"
|
||||||
|
|||||||
@ -24,7 +24,7 @@ export default {
|
|||||||
return toolbarModule;
|
return toolbarModule;
|
||||||
},
|
},
|
||||||
getPanelModule({ commandsManager, api, servicesManager }) {
|
getPanelModule({ commandsManager, api, servicesManager }) {
|
||||||
const { UINotificationService } = servicesManager;
|
const { UINotificationService } = servicesManager.services;
|
||||||
|
|
||||||
const ExtendedSegmentationPanel = props => {
|
const ExtendedSegmentationPanel = props => {
|
||||||
const { activeContexts } = api.hooks.useAppContext();
|
const { activeContexts } = api.hooks.useAppContext();
|
||||||
@ -46,7 +46,7 @@ export default {
|
|||||||
const onSegmentVisibilityChangeHandler = (segmentNumber, visible) => {
|
const onSegmentVisibilityChangeHandler = (segmentNumber, visible) => {
|
||||||
commandsManager.runCommand('setSegmentConfiguration', {
|
commandsManager.runCommand('setSegmentConfiguration', {
|
||||||
segmentNumber,
|
segmentNumber,
|
||||||
visible
|
visible,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ export default {
|
|||||||
globalOpacity: configuration.fillAlpha,
|
globalOpacity: configuration.fillAlpha,
|
||||||
outlineThickness: configuration.outlineWidth,
|
outlineThickness: configuration.outlineWidth,
|
||||||
renderOutline: configuration.renderOutline,
|
renderOutline: configuration.renderOutline,
|
||||||
visible: configuration.renderFill
|
visible: configuration.renderFill,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,7 @@ export default async function loadSegmentation(
|
|||||||
results = _parseSeg(segArrayBuffer, imageIds);
|
results = _parseSeg(segArrayBuffer, imageIds);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
segDisplaySet.isLoaded = false;
|
segDisplaySet.isLoaded = false;
|
||||||
|
segDisplaySet.loadError = true;
|
||||||
reject(error);
|
reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,92 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.6.9](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.8...@ohif/extension-vtk@1.6.9) (2020-07-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.8](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.7...@ohif/extension-vtk@1.6.8) (2020-07-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.7](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.6...@ohif/extension-vtk@1.6.7) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.5...@ohif/extension-vtk@1.6.6) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.4...@ohif/extension-vtk@1.6.5) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.3...@ohif/extension-vtk@1.6.4) (2020-06-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.2...@ohif/extension-vtk@1.6.3) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.1...@ohif/extension-vtk@1.6.2) (2020-06-05)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.6.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.6.0...@ohif/extension-vtk@1.6.1) (2020-06-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [1.6.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.6...@ohif/extension-vtk@1.6.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [1.5.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.5...@ohif/extension-vtk@1.5.6) (2020-05-14)
|
## [1.5.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.5...@ohif/extension-vtk@1.5.6) (2020-05-14)
|
||||||
|
|
||||||
**Note:** Version bump only for package @ohif/extension-vtk
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-vtk",
|
"name": "@ohif/extension-vtk",
|
||||||
"version": "1.5.6",
|
"version": "1.6.9",
|
||||||
"description": "OHIF extension for VTK.js",
|
"description": "OHIF extension for VTK.js",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -35,7 +35,7 @@
|
|||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"cornerstone-wado-image-loader": "^3.1.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.12.2",
|
"dcmjs": "0.16.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"i18next": "^17.0.3",
|
"i18next": "^17.0.3",
|
||||||
"i18next-browser-languagedetector": "^3.0.1",
|
"i18next-browser-languagedetector": "^3.0.1",
|
||||||
@ -53,8 +53,8 @@
|
|||||||
"react-vtkjs-viewport": "^0.9.0"
|
"react-vtkjs-viewport": "^0.9.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ohif/core": "^2.9.6",
|
"@ohif/core": "^2.9.13",
|
||||||
"@ohif/ui": "^1.4.4",
|
"@ohif/ui": "^1.5.3",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"cornerstone-wado-image-loader": "^3.1.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import React from 'react';
|
||||||
import asyncComponent from './asyncComponent.js';
|
import asyncComponent from './asyncComponent.js';
|
||||||
import commandsModule from './commandsModule.js';
|
import commandsModule from './commandsModule.js';
|
||||||
import toolbarModule from './toolbarModule.js';
|
import toolbarModule from './toolbarModule.js';
|
||||||
@ -16,7 +17,8 @@ const vtkExtension = {
|
|||||||
id: 'vtk',
|
id: 'vtk',
|
||||||
|
|
||||||
getViewportModule({ commandsManager }) {
|
getViewportModule({ commandsManager }) {
|
||||||
return withCommandsManager(OHIFVTKViewport, commandsManager);
|
const ExtendedVTKViewport = props => <OHIFVTKViewport {...props} />;
|
||||||
|
return withCommandsManager(ExtendedVTKViewport, commandsManager);
|
||||||
},
|
},
|
||||||
getToolbarModule() {
|
getToolbarModule() {
|
||||||
return toolbarModule;
|
return toolbarModule;
|
||||||
|
|||||||
26
netlify-lerna-cache.sh
Executable file
26
netlify-lerna-cache.sh
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
NODE_MODULES_CACHE="./node_modules"
|
||||||
|
LERNA_CACHE="$NODE_MODULES_CACHE/lerna-cache"
|
||||||
|
|
||||||
|
echo "Running netlify-lerna-cache.sh"
|
||||||
|
mkdir -p "$NODE_MODULES_CACHE/lerna-cache"
|
||||||
|
|
||||||
|
cache_deps() {
|
||||||
|
PACKAGES=$(ls -1 $1)
|
||||||
|
|
||||||
|
for PKG in $PACKAGES
|
||||||
|
do
|
||||||
|
PKG_NODE_MODULES="$1/$PKG/node_modules"
|
||||||
|
if [ -d $PKG_NODE_MODULES ];
|
||||||
|
then
|
||||||
|
mv $PKG_NODE_MODULES $LERNA_CACHE/$PKG
|
||||||
|
echo "Cached node modules for $PKG"
|
||||||
|
else
|
||||||
|
echo "Unable to cache node modules for $PKG"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_deps platform
|
||||||
|
cache_deps extensions
|
||||||
|
cache_deps modes
|
||||||
27
netlify-lerna-restore.sh
Executable file
27
netlify-lerna-restore.sh
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
NODE_MODULES_CACHE="./node_modules"
|
||||||
|
LERNA_CACHE="$NODE_MODULES_CACHE/lerna-cache"
|
||||||
|
|
||||||
|
echo "Running netlify-lerna-restore.sh"
|
||||||
|
mkdir -p "$NODE_MODULES_CACHE/lerna-cache"
|
||||||
|
echo "$NODE_MODULES_CACHE/lerna-cache/*"
|
||||||
|
|
||||||
|
restore_deps() {
|
||||||
|
PACKAGES=$(ls -1 $1)
|
||||||
|
|
||||||
|
for PKG in $PACKAGES
|
||||||
|
do
|
||||||
|
PKG_CACHE="$LERNA_CACHE/$PKG"
|
||||||
|
if [ -d $PKG_CACHE ];
|
||||||
|
then
|
||||||
|
mv $PKG_CACHE $1/$PKG/node_modules
|
||||||
|
echo "Restored node modules for $PKG"
|
||||||
|
else
|
||||||
|
echo "Unable to restore cache for $PKG"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_deps platform
|
||||||
|
restore_deps extensions
|
||||||
|
restore_deps modes
|
||||||
13
netlify.toml
13
netlify.toml
@ -8,6 +8,11 @@
|
|||||||
# managed by CircleCI and deployed to our Google Hosting
|
# managed by CircleCI and deployed to our Google Hosting
|
||||||
#
|
#
|
||||||
|
|
||||||
|
[build]
|
||||||
|
base = ""
|
||||||
|
publish = ".netlify/www/"
|
||||||
|
command = "chmod +x .netlify/build-deploy-preview.sh && .netlify/build-deploy-preview.sh"
|
||||||
|
|
||||||
# NODE_VERSION in root `.nvmrc` takes priority
|
# NODE_VERSION in root `.nvmrc` takes priority
|
||||||
# YARN_FLAGS: https://www.netlify.com/docs/build-gotchas/#yarn
|
# YARN_FLAGS: https://www.netlify.com/docs/build-gotchas/#yarn
|
||||||
[build.environment]
|
[build.environment]
|
||||||
@ -16,19 +21,13 @@
|
|||||||
YARN_VERSION = "1.17.3"
|
YARN_VERSION = "1.17.3"
|
||||||
RUBY_VERSION = "2.6.2"
|
RUBY_VERSION = "2.6.2"
|
||||||
YARN_FLAGS = "--no-ignore-optional --pure-lockfile"
|
YARN_FLAGS = "--no-ignore-optional --pure-lockfile"
|
||||||
|
NETLIFY_RESTORE = "1"
|
||||||
|
|
||||||
# Production context: all deploys from the Production branch set in your site's
|
# Production context: all deploys from the Production branch set in your site's
|
||||||
# deploy contexts will inherit these settings.
|
# deploy contexts will inherit these settings.
|
||||||
[context.production]
|
[context.production]
|
||||||
ignore = "exit 0" # Never build production; We'll let our CI do that
|
ignore = "exit 0" # Never build production; We'll let our CI do that
|
||||||
|
|
||||||
# Deploy Preview context: all deploys generated from a pull/merge request will
|
|
||||||
# inherit these settings.
|
|
||||||
[context.deploy-preview]
|
|
||||||
base = ""
|
|
||||||
publish = ".netlify/www/"
|
|
||||||
command = "chmod +x .netlify/build-deploy-preview.sh && .netlify/build-deploy-preview.sh"
|
|
||||||
|
|
||||||
[[headers]]
|
[[headers]]
|
||||||
# Define which paths this specific [[headers]] block will cover.
|
# Define which paths this specific [[headers]] block will cover.
|
||||||
for = "/*"
|
for = "/*"
|
||||||
|
|||||||
@ -34,6 +34,9 @@
|
|||||||
"see-changed": "lerna changed",
|
"see-changed": "lerna changed",
|
||||||
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
|
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
|
||||||
"release": "yarn run lerna:version && yarn run lerna:publish",
|
"release": "yarn run lerna:version && yarn run lerna:publish",
|
||||||
|
"lerna:cache": "[ $NETLIFY_RESTORE = 1 ] && ./netlify-lerna-cache.sh || :",
|
||||||
|
"lerna:restore": "[ $NETLIFY_RESTORE = 1 ] && ./netlify-lerna-restore.sh || :",
|
||||||
|
"preinstall": "yarn lerna:restore",
|
||||||
"lerna:version": "npx lerna version prerelease --force-publish",
|
"lerna:version": "npx lerna version prerelease --force-publish",
|
||||||
"lerna:publish": "lerna publish from-package --canary --dist-tag canary",
|
"lerna:publish": "lerna publish from-package --canary --dist-tag canary",
|
||||||
"link-list": "npm ls --depth=0 --link=true"
|
"link-list": "npm ls --depth=0 --link=true"
|
||||||
|
|||||||
@ -3,6 +3,74 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [2.9.13](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.12...@ohif/core@2.9.13) (2020-07-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Switch DICOMFileUploader to use the UIModalService ([#1904](https://github.com/OHIF/Viewers/issues/1904)) ([7772fee](https://github.com/OHIF/Viewers/commit/7772fee21ae6a65994e1251e2f1d2554b47781be))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.12](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.11...@ohif/core@2.9.12) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 - Put guards in all places that a cornerstone re-render ([#1899](https://github.com/OHIF/Viewers/issues/1899)) ([451f7ea](https://github.com/OHIF/Viewers/commit/451f7eab9258e7a193eb362e0926b13aedc4b3c9))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.11](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.10...@ohif/core@2.9.11) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.10](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.9...@ohif/core@2.9.10) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix RT Panel hide/show and Fix looping load errors ([#1877](https://github.com/OHIF/Viewers/issues/1877)) ([e7cc735](https://github.com/OHIF/Viewers/commit/e7cc735c03d02eeb0d3af4ba02c15ed4f81bbec2))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.9](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.8...@ohif/core@2.9.9) (2020-06-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.8](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.7...@ohif/core@2.9.8) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2.9.7](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.6...@ohif/core@2.9.7) (2020-06-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [2.9.6](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.5...@ohif/core@2.9.6) (2020-05-14)
|
## [2.9.6](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.5...@ohif/core@2.9.6) (2020-05-14)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/core",
|
"name": "@ohif/core",
|
||||||
"version": "2.9.6",
|
"version": "2.9.13",
|
||||||
"description": "Generic business logic for web-based medical imaging applications",
|
"description": "Generic business logic for web-based medical imaging applications",
|
||||||
"author": "OHIF Core Team",
|
"author": "OHIF Core Team",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.5.5",
|
"@babel/runtime": "^7.5.5",
|
||||||
"ajv": "^6.10.0",
|
"ajv": "^6.10.0",
|
||||||
"dcmjs": "^0.12.2",
|
"dcmjs": "0.16.0",
|
||||||
"dicomweb-client": "^0.6.0",
|
"dicomweb-client": "^0.6.0",
|
||||||
"immer": "6.0.2",
|
"immer": "6.0.2",
|
||||||
"isomorphic-base64": "^1.0.2",
|
"isomorphic-base64": "^1.0.2",
|
||||||
|
|||||||
@ -13,7 +13,7 @@ const findMostRecentStructuredReport = studies => {
|
|||||||
// Skip series that may not have instances yet
|
// Skip series that may not have instances yet
|
||||||
// This can happen if we have retrieved just the initial
|
// This can happen if we have retrieved just the initial
|
||||||
// details about the series via QIDO-RS, but not the full metadata
|
// details about the series via QIDO-RS, but not the full metadata
|
||||||
if (!series.instances.length) {
|
if (!series.instances || !series.instances.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -135,6 +135,7 @@ export class StudyMetadata extends Metadata {
|
|||||||
study,
|
study,
|
||||||
sopClassUIDs
|
sopClassUIDs
|
||||||
);
|
);
|
||||||
|
|
||||||
if (displaySet) {
|
if (displaySet) {
|
||||||
displaySet.sopClassModule = true;
|
displaySet.sopClassModule = true;
|
||||||
|
|
||||||
@ -215,6 +216,14 @@ export class StudyMetadata extends Metadata {
|
|||||||
// TODO -> Get x Modality by referencedSeriesInstanceUid, FoR, etc.
|
// TODO -> Get x Modality by referencedSeriesInstanceUid, FoR, etc.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the displaySets to the studies list of derived displaySets.
|
||||||
|
* @param {array} displaySets The displaySets array to append to the derived displaysets list.
|
||||||
|
*/
|
||||||
|
_addDerivedDisplaySets(displaySets) {
|
||||||
|
displaySets.map(displaySet => this._derivedDisplaySets.push(displaySet));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of derived datasets in the study, filtered by the given filter.
|
* Returns a list of derived datasets in the study, filtered by the given filter.
|
||||||
* @param {object} filter An object containing search filters
|
* @param {object} filter An object containing search filters
|
||||||
@ -263,7 +272,7 @@ export class StudyMetadata extends Metadata {
|
|||||||
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
||||||
displaySet =>
|
displaySet =>
|
||||||
displaySet.ReferencedFrameOfReferenceUID ===
|
displaySet.ReferencedFrameOfReferenceUID ===
|
||||||
ReferencedFrameOfReferenceUID
|
referencedFrameOfReferenceUID
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -251,7 +251,9 @@ export default class MeasurementApi {
|
|||||||
this.syncMeasurementsAndToolData();
|
this.syncMeasurementsAndToolData();
|
||||||
|
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
if (enabledElement.image) {
|
||||||
cornerstone.updateImage(enabledElement.element);
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Let others know that the measurements are updated
|
// Let others know that the measurements are updated
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
import cornerstone from 'cornerstone-core';
|
||||||
|
|
||||||
|
export default function refreshCornerstoneViewports() {
|
||||||
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
if (enabledElement.image) {
|
||||||
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import log from '../../log';
|
|||||||
import user from '../../user';
|
import user from '../../user';
|
||||||
import getImageAttributes from '../lib/getImageAttributes';
|
import getImageAttributes from '../lib/getImageAttributes';
|
||||||
import getLabel from '../lib/getLabel';
|
import getLabel from '../lib/getLabel';
|
||||||
|
import refreshCornerstoneViewports from '../lib/refreshCornerstoneViewports';
|
||||||
|
|
||||||
export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
||||||
const measurementApi = MeasurementApi.Instance;
|
const measurementApi = MeasurementApi.Instance;
|
||||||
@ -86,9 +87,7 @@ export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This is very hacky, but will work for now
|
// TODO: This is very hacky, but will work for now
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
refreshCornerstoneViewports();
|
||||||
cornerstone.updateImage(enabledElement.element);
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: Notify about the last activated measurement
|
// TODO: Notify about the last activated measurement
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import cornerstone from 'cornerstone-core';
|
import cornerstone from 'cornerstone-core';
|
||||||
import { MeasurementApi } from '../classes';
|
import { MeasurementApi } from '../classes';
|
||||||
import log from '../../log';
|
import log from '../../log';
|
||||||
|
import refreshCornerstoneViewports from '../lib/refreshCornerstoneViewports';
|
||||||
|
|
||||||
export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
||||||
log.info('CornerstoneToolsMeasurementRemoved');
|
log.info('CornerstoneToolsMeasurementRemoved');
|
||||||
@ -37,9 +38,7 @@ export default function({ eventData, tool, toolGroupId, toolGroup }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This is very hacky, but will work for now
|
// TODO: This is very hacky, but will work for now
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
refreshCornerstoneViewports();
|
||||||
cornerstone.updateImage(enabledElement.element);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (MeasurementApi.isToolIncluded(tool)) {
|
if (MeasurementApi.isToolIncluded(tool)) {
|
||||||
// TODO: Notify that viewer suffered changes
|
// TODO: Notify that viewer suffered changes
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import log from '../../log';
|
|||||||
import user from '../../user';
|
import user from '../../user';
|
||||||
import getImageAttributes from '../lib/getImageAttributes';
|
import getImageAttributes from '../lib/getImageAttributes';
|
||||||
import getLabel from '../lib/getLabel';
|
import getLabel from '../lib/getLabel';
|
||||||
|
import refreshCornerstoneViewports from '../lib/refreshCornerstoneViewports';
|
||||||
|
|
||||||
export default function handleSingleMeasurementAdded({ eventData, tool }) {
|
export default function handleSingleMeasurementAdded({ eventData, tool }) {
|
||||||
const measurementApi = MeasurementApi.Instance;
|
const measurementApi = MeasurementApi.Instance;
|
||||||
@ -39,9 +40,7 @@ export default function handleSingleMeasurementAdded({ eventData, tool }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This is very hacky, but will work for now
|
// TODO: This is very hacky, but will work for now
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
refreshCornerstoneViewports();
|
||||||
cornerstone.updateImage(enabledElement.element);
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: Notify about the last activated measurement
|
// TODO: Notify about the last activated measurement
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import cornerstone from 'cornerstone-core';
|
import cornerstone from 'cornerstone-core';
|
||||||
import { MeasurementApi } from '../classes';
|
import { MeasurementApi } from '../classes';
|
||||||
import log from '../../log';
|
import log from '../../log';
|
||||||
|
import refreshCornerstoneViewports from '../lib/refreshCornerstoneViewports';
|
||||||
|
|
||||||
export default function handleSingleMeasurementRemoved({
|
export default function handleSingleMeasurementRemoved({
|
||||||
eventData,
|
eventData,
|
||||||
@ -35,9 +36,7 @@ export default function handleSingleMeasurementRemoved({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// TODO: This is very hacky, but will work for now
|
// TODO: This is very hacky, but will work for now
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
refreshCornerstoneViewports();
|
||||||
cornerstone.updateImage(enabledElement.element);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (MeasurementApi.isToolIncluded(tool)) {
|
if (MeasurementApi.isToolIncluded(tool)) {
|
||||||
// TODO: Notify that viewer suffered changes
|
// TODO: Notify that viewer suffered changes
|
||||||
|
|||||||
@ -6,11 +6,12 @@ const defaultState = {
|
|||||||
|
|
||||||
const servers = (state = defaultState, action) => {
|
const servers = (state = defaultState, action) => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case 'SET_STUDY_DATA':
|
case 'SET_STUDY_DATA': {
|
||||||
const updatedStudyData = cloneDeep(state).studyData;
|
const updatedStudyData = cloneDeep(state.studyData);
|
||||||
updatedStudyData[action.StudyInstanceUID] = action.data;
|
updatedStudyData[action.StudyInstanceUID] = cloneDeep(action.data);
|
||||||
|
|
||||||
return Object.assign({}, state, { studyData: updatedStudyData });
|
return Object.assign({}, state, { studyData: updatedStudyData });
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,13 +28,14 @@ const serviceImplementation = {
|
|||||||
/**
|
/**
|
||||||
* Show a new UI modal;
|
* Show a new UI modal;
|
||||||
*
|
*
|
||||||
* @param {ModalProps} props { content, contentProps, shouldCloseOnEsc, isOpen, closeButton, title, customClassName }
|
* @param {ModalProps} props { content, contentProps, shouldCloseOnEsc, isOpen, onClose, closeButton, title, customClassName }
|
||||||
*/
|
*/
|
||||||
function _show({
|
function _show({
|
||||||
content = null,
|
content = null,
|
||||||
contentProps = null,
|
contentProps = null,
|
||||||
shouldCloseOnEsc = false,
|
shouldCloseOnEsc = false,
|
||||||
isOpen = true,
|
isOpen = true,
|
||||||
|
onClose = null,
|
||||||
closeButton = true,
|
closeButton = true,
|
||||||
title = null,
|
title = null,
|
||||||
customClassName = null,
|
customClassName = null,
|
||||||
@ -44,6 +45,7 @@ function _show({
|
|||||||
contentProps,
|
contentProps,
|
||||||
shouldCloseOnEsc,
|
shouldCloseOnEsc,
|
||||||
isOpen,
|
isOpen,
|
||||||
|
onClose,
|
||||||
closeButton,
|
closeButton,
|
||||||
title,
|
title,
|
||||||
customClassName,
|
customClassName,
|
||||||
|
|||||||
@ -82,12 +82,17 @@ const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {
|
|||||||
// For each type, see if any are loaded, if not load the most recent.
|
// For each type, see if any are loaded, if not load the most recent.
|
||||||
Object.keys(displaySetsPerModality).forEach(key => {
|
Object.keys(displaySetsPerModality).forEach(key => {
|
||||||
const displaySets = displaySetsPerModality[key];
|
const displaySets = displaySetsPerModality[key];
|
||||||
|
|
||||||
const isLoaded = displaySets.some(displaySet => displaySet.isLoaded);
|
const isLoaded = displaySets.some(displaySet => displaySet.isLoaded);
|
||||||
|
|
||||||
if (isLoaded) {
|
if (isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (displaySets.some(displaySet => displaySet.loadError)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// find most recent and load it.
|
// find most recent and load it.
|
||||||
let recentDateTime = 0;
|
let recentDateTime = 0;
|
||||||
let recentDisplaySet = displaySets[0];
|
let recentDisplaySet = displaySets[0];
|
||||||
@ -102,6 +107,8 @@ const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
recentDisplaySet.isLoading = true;
|
||||||
|
|
||||||
promises.push(recentDisplaySet.load(referencedDisplaySet, studies));
|
promises.push(recentDisplaySet.load(referencedDisplaySet, studies));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,44 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.5.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.5.2...@ohif/ui@1.5.3) (2020-07-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/ui
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.5.2](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.5.1...@ohif/ui@1.5.2) (2020-07-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Switch DICOMFileUploader to use the UIModalService ([#1904](https://github.com/OHIF/Viewers/issues/1904)) ([7772fee](https://github.com/OHIF/Viewers/commit/7772fee21ae6a65994e1251e2f1d2554b47781be))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [1.5.1](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.5.0...@ohif/ui@1.5.1) (2020-06-05)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/ui
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [1.5.0](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.4...@ohif/ui@1.5.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [1.4.4](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.3...@ohif/ui@1.4.4) (2020-05-04)
|
## [1.4.4](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.3...@ohif/ui@1.4.4) (2020-05-04)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
25
platform/ui/gatsby-node.js
Normal file
25
platform/ui/gatsby-node.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const path = require('path');
|
||||||
|
// ~~ Plugins
|
||||||
|
const PnpWebpackPlugin = require(`pnp-webpack-plugin`); // Required until Webpack@5
|
||||||
|
|
||||||
|
exports.onCreateWebpackConfig = args => {
|
||||||
|
args.actions.setWebpackConfig({
|
||||||
|
node: { fs: 'empty' },
|
||||||
|
resolve: {
|
||||||
|
plugins: [PnpWebpackPlugin],
|
||||||
|
// Note the '..' in the path because docz gatsby project lives in the '.docz' directory
|
||||||
|
modules: [
|
||||||
|
// platform/ui
|
||||||
|
path.resolve(__dirname, '../node_modules'),
|
||||||
|
// .docz
|
||||||
|
'node_modules',
|
||||||
|
],
|
||||||
|
// resolve: {
|
||||||
|
// symlinks: true,
|
||||||
|
// },
|
||||||
|
},
|
||||||
|
resolveLoader: {
|
||||||
|
plugins: [PnpWebpackPlugin.moduleLoader(module)],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/ui",
|
"name": "@ohif/ui",
|
||||||
"version": "1.4.4",
|
"version": "1.5.3",
|
||||||
"description": "A set of React components for Medical Imaging Viewers",
|
"description": "A set of React components for Medical Imaging Viewers",
|
||||||
"author": "OHIF Contributors",
|
"author": "OHIF Contributors",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -41,20 +41,24 @@
|
|||||||
"@ohif/i18n": "^0.2.3",
|
"@ohif/i18n": "^0.2.3",
|
||||||
"browser-detect": "^0.2.28",
|
"browser-detect": "^0.2.28",
|
||||||
"classnames": "2.2.6",
|
"classnames": "2.2.6",
|
||||||
|
"dom-helpers": "^3.3.1",
|
||||||
"i18next": "^17.0.3",
|
"i18next": "^17.0.3",
|
||||||
"i18next-browser-languagedetector": "^3.0.1",
|
"i18next-browser-languagedetector": "^3.0.1",
|
||||||
"lodash.debounce": "^4.0.8",
|
"lodash.debounce": "^4.0.8",
|
||||||
"lodash.isequal": "4.5.0",
|
"lodash.isequal": "4.5.0",
|
||||||
"moment": "2.24.0",
|
"moment": "2.24.0",
|
||||||
"prop-types": "15.6.2",
|
"prop-types": "15.6.2",
|
||||||
"react-bootstrap-modal": "4.2.0",
|
"prop-types-extra": "^1.1.1",
|
||||||
"react-dates": "21.2.1",
|
"react-dates": "21.2.1",
|
||||||
"react-dnd": "9.4.0",
|
"react-dnd": "9.4.0",
|
||||||
"react-dnd-html5-backend": "^9.4.0",
|
"react-dnd-html5-backend": "^9.4.0",
|
||||||
"react-dnd-touch-backend": "^9.4.0",
|
"react-dnd-touch-backend": "^9.4.0",
|
||||||
"react-draggable": "^4.1.0",
|
"react-draggable": "^4.1.0",
|
||||||
|
"react-error-boundary": "^2.2.1",
|
||||||
"react-i18next": "^10.11.0",
|
"react-i18next": "^10.11.0",
|
||||||
"react-modal": "^3.11.1",
|
"react-modal": "^3.11.1",
|
||||||
|
"react-overlays": "^0.8.0",
|
||||||
|
"react-transition-group": "2.0.0",
|
||||||
"react-with-direction": "1.3.0"
|
"react-with-direction": "1.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
51
platform/ui/src/components/errorBoundary/ErrorBoundary.js
Normal file
51
platform/ui/src/components/errorBoundary/ErrorBoundary.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { ErrorBoundary } from 'react-error-boundary';
|
||||||
|
import './ErrorFallback.css';
|
||||||
|
|
||||||
|
const ErrorFallback = ({ error, componentStack, resetErrorBoundary }) => {
|
||||||
|
return (
|
||||||
|
<div className="ErrorFallback" role="alert">
|
||||||
|
<p>Something went wrong.</p>
|
||||||
|
<pre>{error.message}</pre>
|
||||||
|
<pre>{componentStack}</pre>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const OHIFErrorBoundary = ({
|
||||||
|
context = 'OHIF',
|
||||||
|
onReset = () => {},
|
||||||
|
onError = () => {},
|
||||||
|
fallbackComponent,
|
||||||
|
children,
|
||||||
|
}) => {
|
||||||
|
const onErrorHandler = (error, componentStack) => {
|
||||||
|
console.error(`${context} Error Boundary`, error, componentStack);
|
||||||
|
onError(error, componentStack);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onResetHandler = () => {
|
||||||
|
onReset();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ErrorBoundary
|
||||||
|
FallbackComponent={fallbackComponent || ErrorFallback}
|
||||||
|
onReset={onResetHandler}
|
||||||
|
onError={onErrorHandler}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</ErrorBoundary>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
OHIFErrorBoundary.propTypes = {
|
||||||
|
context: PropTypes.string,
|
||||||
|
onReset: PropTypes.func,
|
||||||
|
onError: PropTypes.func,
|
||||||
|
children: PropTypes.node.isRequired,
|
||||||
|
fallbackComponent: PropTypes.element,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default OHIFErrorBoundary;
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.ErrorFallback {
|
||||||
|
padding: 10px;
|
||||||
|
color: var(--active-color);
|
||||||
|
}
|
||||||
1
platform/ui/src/components/errorBoundary/index.js
Normal file
1
platform/ui/src/components/errorBoundary/index.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default as ErrorBoundary } from './ErrorBoundary';
|
||||||
@ -7,7 +7,6 @@ import { AboutContent } from './content/aboutContent/AboutContent';
|
|||||||
import { TabComponents, TabFooter } from './tabComponents';
|
import { TabComponents, TabFooter } from './tabComponents';
|
||||||
import { HotkeyField } from './customForm';
|
import { HotkeyField } from './customForm';
|
||||||
import { LanguageSwitcher } from './languageSwitcher';
|
import { LanguageSwitcher } from './languageSwitcher';
|
||||||
|
|
||||||
import { Checkbox } from './checkbox';
|
import { Checkbox } from './checkbox';
|
||||||
import { CineDialog } from './cineDialog';
|
import { CineDialog } from './cineDialog';
|
||||||
import { ViewportDownloadForm } from './content/viewportDownloadForm';
|
import { ViewportDownloadForm } from './content/viewportDownloadForm';
|
||||||
@ -25,8 +24,10 @@ import {
|
|||||||
} from './studyList';
|
} from './studyList';
|
||||||
import { ToolbarSection } from './toolbarSection';
|
import { ToolbarSection } from './toolbarSection';
|
||||||
import { Tooltip } from './tooltip';
|
import { Tooltip } from './tooltip';
|
||||||
|
import { ErrorBoundary } from './errorBoundary';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
ErrorBoundary,
|
||||||
ContextMenu,
|
ContextMenu,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
CineDialog,
|
CineDialog,
|
||||||
|
|||||||
@ -32,6 +32,7 @@ const ModalProvider = ({ children, modal: Modal, service }) => {
|
|||||||
contentProps: null,
|
contentProps: null,
|
||||||
shouldCloseOnEsc: false,
|
shouldCloseOnEsc: false,
|
||||||
isOpen: true,
|
isOpen: true,
|
||||||
|
onClose: null,
|
||||||
closeButton: true,
|
closeButton: true,
|
||||||
title: null,
|
title: null,
|
||||||
customClassName: '',
|
customClassName: '',
|
||||||
@ -73,6 +74,7 @@ const ModalProvider = ({ children, modal: Modal, service }) => {
|
|||||||
content: ModalContent,
|
content: ModalContent,
|
||||||
contentProps,
|
contentProps,
|
||||||
isOpen,
|
isOpen,
|
||||||
|
onClose,
|
||||||
title,
|
title,
|
||||||
customClassName,
|
customClassName,
|
||||||
shouldCloseOnEsc,
|
shouldCloseOnEsc,
|
||||||
@ -88,7 +90,13 @@ const ModalProvider = ({ children, modal: Modal, service }) => {
|
|||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
title={title}
|
title={title}
|
||||||
closeButton={closeButton}
|
closeButton={closeButton}
|
||||||
onClose={hide}
|
onClose={() => {
|
||||||
|
if (onClose) {
|
||||||
|
onClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
hide();
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<ModalContent {...contentProps} show={show} hide={hide} />
|
<ModalContent {...contentProps} show={show} hide={hide} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|||||||
@ -51,3 +51,9 @@ button.close
|
|||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
||||||
|
.btn-sm
|
||||||
|
padding: .25rem .5rem;
|
||||||
|
font-size: .875rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-radius: .2rem;
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import {
|
|||||||
Tooltip,
|
Tooltip,
|
||||||
AboutContent,
|
AboutContent,
|
||||||
OHIFModal,
|
OHIFModal,
|
||||||
|
ErrorBoundary
|
||||||
} from './components';
|
} from './components';
|
||||||
import { useDebounce, useMedia } from './hooks';
|
import { useDebounce, useMedia } from './hooks';
|
||||||
|
|
||||||
@ -123,6 +124,7 @@ export {
|
|||||||
DialogProvider,
|
DialogProvider,
|
||||||
withDialog,
|
withDialog,
|
||||||
useDialog,
|
useDialog,
|
||||||
|
ErrorBoundary,
|
||||||
// Hooks
|
// Hooks
|
||||||
useDebounce,
|
useDebounce,
|
||||||
useMedia,
|
useMedia,
|
||||||
|
|||||||
@ -3,6 +3,147 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [4.2.13](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.12...@ohif/viewer@4.2.13) (2020-07-23)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.12](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.11...@ohif/viewer@4.2.12) (2020-07-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Switch DICOMFileUploader to use the UIModalService ([#1904](https://github.com/OHIF/Viewers/issues/1904)) ([7772fee](https://github.com/OHIF/Viewers/commit/7772fee21ae6a65994e1251e2f1d2554b47781be))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.11](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.10...@ohif/viewer@4.2.11) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 - Put guards in all places that a cornerstone re-render ([#1899](https://github.com/OHIF/Viewers/issues/1899)) ([451f7ea](https://github.com/OHIF/Viewers/commit/451f7eab9258e7a193eb362e0926b13aedc4b3c9))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.10](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.9...@ohif/viewer@4.2.10) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.9](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.8...@ohif/viewer@4.2.9) (2020-07-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.8](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.7...@ohif/viewer@4.2.8) (2020-07-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Fix RT Panel hide/show and Fix looping load errors ([#1877](https://github.com/OHIF/Viewers/issues/1877)) ([e7cc735](https://github.com/OHIF/Viewers/commit/e7cc735c03d02eeb0d3af4ba02c15ed4f81bbec2))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.7](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.6...@ohif/viewer@4.2.7) (2020-06-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.6](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.5...@ohif/viewer@4.2.6) (2020-06-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.4...@ohif/viewer@4.2.5) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 Disable seg panel when data for seg unavailable ([#1732](https://github.com/OHIF/Viewers/issues/1732)) ([698e900](https://github.com/OHIF/Viewers/commit/698e900b85121d3c2a46747c443ef69fb7a8c95b)), closes [#1728](https://github.com/OHIF/Viewers/issues/1728)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.4](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.3...@ohif/viewer@4.2.4) (2020-06-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* OIDC Redirect erases query parameters ([#1773](https://github.com/OHIF/Viewers/issues/1773)) ([6123741](https://github.com/OHIF/Viewers/commit/6123741765e81d0bea8fbd5dbb0f310aaca0fb33))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.2...@ohif/viewer@4.2.3) (2020-06-05)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.1...@ohif/viewer@4.2.2) (2020-06-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [4.2.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.2.0...@ohif/viewer@4.2.1) (2020-06-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [4.2.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.1.0...@ohif/viewer@4.2.0) (2020-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* 🎸 1729 - error boundary wrapper ([#1764](https://github.com/OHIF/Viewers/issues/1764)) ([c02b232](https://github.com/OHIF/Viewers/commit/c02b232b0cc24f38af5d5e3831d987d048e60ada))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [4.1.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.0.0...@ohif/viewer@4.1.0) (2020-05-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* expose some app internals as window.app ([#1735](https://github.com/OHIF/Viewers/issues/1735)) ([63fd656](https://github.com/OHIF/Viewers/commit/63fd65690cba450721870a6222e0fb3ad71bb291))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [4.0.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.11...@ohif/viewer@4.0.0) (2020-05-14)
|
# [4.0.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.11...@ohif/viewer@4.0.0) (2020-05-14)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -115,13 +115,13 @@ Commands to run the tests:
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// Open Cypress Dashboard that provides insight into what happened when your tests ran
|
// Open Cypress Dashboard that provides insight into what happened when your tests ran
|
||||||
yarn run cy
|
yarn test:e2e
|
||||||
|
|
||||||
// Run all tests using Electron browser headless
|
// Run all tests using Electron browser headless
|
||||||
yarn run cy:run
|
yarn test:e2e:local
|
||||||
|
|
||||||
// Run all tests in CI mode
|
// Run all tests in CI mode
|
||||||
yarn run cy:run:ci
|
yarn run test:e2e:ci
|
||||||
```
|
```
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|||||||
@ -5,17 +5,18 @@ describe('OHIF Routes', function() {
|
|||||||
cy.openStudyList();
|
cy.openStudyList();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('checks TEST json url study route', function() {
|
// TODO -> Bring back when testJSON is hosted again.
|
||||||
cy.visit(
|
// it('checks TEST json url study route', function() {
|
||||||
'/viewer?url=https://ohif-viewer.s3.eu-central-1.amazonaws.com/JSON/testJSON.json'
|
// cy.visit(
|
||||||
);
|
// '/viewer?url=https://ohif-viewer.s3.eu-central-1.amazonaws.com/JSON/testJSON.json'
|
||||||
|
// );
|
||||||
|
|
||||||
cy.server();
|
// cy.server();
|
||||||
cy.route('GET', '**/MRStudy/**').as('getTESTStudy');
|
// cy.route('GET', '**/ MRStudy; /**').as('getTESTStudy');
|
||||||
|
|
||||||
cy.wait('@getTESTStudy.all');
|
// cy.wait('@getTESTStudy.all');
|
||||||
cy.get('@getTESTStudy').should($route => {
|
// cy.get('@getTESTStudy').should($route => {
|
||||||
expect($route.status).to.be.eq(200);
|
// expect($route.status).to.be.eq(200);
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
});
|
});
|
||||||
|
|||||||
@ -38,12 +38,12 @@ describe('OHIF Study List', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('searches Accession with exact string', function() {
|
it('searches Accession with exact string', function() {
|
||||||
cy.get('@AccessionNumber').type('fpcben98890');
|
cy.get('@AccessionNumber').type('0000481914');
|
||||||
//Wait result list to be displayed
|
//Wait result list to be displayed
|
||||||
cy.waitStudyList();
|
cy.waitStudyList();
|
||||||
cy.get('@searchResult').should($list => {
|
cy.get('@searchResult').should($list => {
|
||||||
expect($list.length).to.be.eq(1);
|
expect($list.length).to.be.eq(1);
|
||||||
expect($list).to.contain('fpcben98890');
|
expect($list).to.contain('0000481914');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -52,7 +52,8 @@ describe('OHIF Study List', function() {
|
|||||||
//Wait result list to be displayed
|
//Wait result list to be displayed
|
||||||
cy.waitStudyList();
|
cy.waitStudyList();
|
||||||
cy.get('@searchResult').should($list => {
|
cy.get('@searchResult').should($list => {
|
||||||
expect($list.length).to.be.eq(15); // TODO: Where are you hiding MISTER^MR?
|
// TODO: Why are we facing some inconsistency with this result? ¯\_(ツ)_/¯
|
||||||
|
expect($list.length).to.be.eq(9);
|
||||||
expect($list).to.contain('MR');
|
expect($list).to.contain('MR');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -147,18 +148,19 @@ describe('OHIF Study List', function() {
|
|||||||
//Wait result list to be displayed
|
//Wait result list to be displayed
|
||||||
cy.waitStudyList();
|
cy.waitStudyList();
|
||||||
cy.get('@searchResult').should($list => {
|
cy.get('@searchResult').should($list => {
|
||||||
expect($list.length).to.be.eq(15); // TODO: Where are you hiding MISTER^MR?
|
// TODO: Why are we facing some inconsistency with this result? ¯\_(ツ)_/¯
|
||||||
|
expect($list.length).to.be.eq(9);
|
||||||
expect($list).to.contain('MR');
|
expect($list).to.contain('MR');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('searches Accession with exact string', function() {
|
it('searches Accession with exact string', function() {
|
||||||
cy.get('@accessionModalityDescription').type('fpcben98890');
|
cy.get('@accessionModalityDescription').type('0000481914');
|
||||||
//Wait result list to be displayed
|
//Wait result list to be displayed
|
||||||
cy.waitStudyList();
|
cy.waitStudyList();
|
||||||
cy.get('@searchResult').should($list => {
|
cy.get('@searchResult').should($list => {
|
||||||
expect($list.length).to.be.eq(1);
|
expect($list.length).to.be.eq(1);
|
||||||
expect($list).to.contain('fpcben98890');
|
expect($list).to.contain('0000481914');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
describe('OHIF Microscopy Extension', () => {
|
describe('OHIF Microscopy Extension', () => {
|
||||||
before(() => {
|
before(() => {
|
||||||
cy.openStudyModality('SM');
|
cy.openStudyModality('SM');
|
||||||
cy.expectMinimumThumbnails(6);
|
cy.expectMinimumThumbnails(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('checks if series thumbnails are being displayed', () => {
|
it('checks if series thumbnails are being displayed', () => {
|
||||||
|
|||||||
@ -5,13 +5,15 @@ describe('Visual Regression - OHIF Routes', function() {
|
|||||||
cy.openStudyList();
|
cy.openStudyList();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
// TODO -> Bring back when testJSON is hosted again.
|
||||||
it('checks TEST json url study route', function() {
|
it('checks TEST json url study route', function() {
|
||||||
cy.visit(
|
cy.visit(
|
||||||
'/viewer?url=https://ohif-viewer.s3.eu-central-1.amazonaws.com/JSON/testJSON.json'
|
'/viewer?url=https://ohif-viewer.s3.eu-central-1.amazonaws.com/JSON/testJSON.json'
|
||||||
);
|
);
|
||||||
|
|
||||||
cy.server();
|
cy.server();
|
||||||
cy.route('GET', '**/TESTStudy/**').as('getTESTStudy');
|
cy.route('GET', '**/ TESTStudy; /**').as('getTESTStudy');
|
||||||
|
|
||||||
cy.wait('@getTESTStudy.all');
|
cy.wait('@getTESTStudy.all');
|
||||||
cy.get('@getTESTStudy').should($route => {
|
cy.get('@getTESTStudy').should($route => {
|
||||||
@ -20,4 +22,5 @@ describe('Visual Regression - OHIF Routes', function() {
|
|||||||
|
|
||||||
cy.percyCanvasSnapshot('TEST json study route');
|
cy.percyCanvasSnapshot('TEST json study route');
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
});
|
});
|
||||||
|
|||||||
@ -109,7 +109,7 @@ Cypress.Commands.add('waitStudyList', () => {
|
|||||||
|
|
||||||
Cypress.Commands.add('waitVTKLoading', () => {
|
Cypress.Commands.add('waitVTKLoading', () => {
|
||||||
// Wait for start loading
|
// Wait for start loading
|
||||||
cy.get('[data-cy="viewprt-grid"]', { timeout: 10000 }).should($grid => {
|
cy.get('[data-cy="viewprt-grid"]', { timeout: 20000 }).should($grid => {
|
||||||
expect($grid).to.contain.text('Loading');
|
expect($grid).to.contain.text('Loading');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/viewer",
|
"name": "@ohif/viewer",
|
||||||
"version": "4.0.0",
|
"version": "4.2.13",
|
||||||
"description": "OHIF Viewer",
|
"description": "OHIF Viewer",
|
||||||
"author": "OHIF Contributors",
|
"author": "OHIF Contributors",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -48,18 +48,18 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.5.5",
|
"@babel/runtime": "^7.5.5",
|
||||||
"@ohif/core": "^2.9.6",
|
"@ohif/core": "^2.9.13",
|
||||||
"@ohif/extension-cornerstone": "^2.7.3",
|
"@ohif/extension-cornerstone": "^2.8.4",
|
||||||
"@ohif/extension-dicom-html": "^1.2.2",
|
"@ohif/extension-dicom-html": "^1.2.4",
|
||||||
"@ohif/extension-dicom-microscopy": "^0.50.9",
|
"@ohif/extension-dicom-microscopy": "^0.51.0",
|
||||||
"@ohif/extension-dicom-p10-downloader": "^0.1.0",
|
"@ohif/extension-dicom-p10-downloader": "^0.1.2",
|
||||||
"@ohif/extension-dicom-pdf": "^1.0.3",
|
"@ohif/extension-dicom-pdf": "^1.0.3",
|
||||||
"@ohif/extension-dicom-rt": "^0.1.4",
|
"@ohif/extension-dicom-rt": "^0.2.5",
|
||||||
"@ohif/extension-dicom-segmentation": "^0.2.6",
|
"@ohif/extension-dicom-segmentation": "^0.3.3",
|
||||||
"@ohif/extension-lesion-tracker": "^0.2.0",
|
"@ohif/extension-lesion-tracker": "^0.2.0",
|
||||||
"@ohif/extension-vtk": "^1.5.6",
|
"@ohif/extension-vtk": "^1.6.9",
|
||||||
"@ohif/i18n": "^0.52.8",
|
"@ohif/i18n": "^0.52.8",
|
||||||
"@ohif/ui": "^1.4.4",
|
"@ohif/ui": "^1.5.3",
|
||||||
"@tanem/react-nprogress": "^1.1.25",
|
"@tanem/react-nprogress": "^1.1.25",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"core-js": "^3.2.1",
|
"core-js": "^3.2.1",
|
||||||
@ -67,7 +67,7 @@
|
|||||||
"cornerstone-math": "^0.1.8",
|
"cornerstone-math": "^0.1.8",
|
||||||
"cornerstone-tools": "4.15.1",
|
"cornerstone-tools": "4.15.1",
|
||||||
"cornerstone-wado-image-loader": "^3.1.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.12.2",
|
"dcmjs": "0.16.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"dicomweb-client": "^0.4.4",
|
"dicomweb-client": "^0.4.4",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
|
|||||||
@ -9,11 +9,10 @@ window.config = function(props) {
|
|||||||
httpErrorHandler: error => {
|
httpErrorHandler: error => {
|
||||||
// This is 429 when rejected from the public idc sandbox too often.
|
// This is 429 when rejected from the public idc sandbox too often.
|
||||||
console.warn(error.status);
|
console.warn(error.status);
|
||||||
|
|
||||||
// Could use services manager here to bring up a dialog/modal if needed.
|
// Could use services manager here to bring up a dialog/modal if needed.
|
||||||
console.warn('test, navigate to https://ohif.org/');
|
console.warn('test, navigate to https://ohif.org/');
|
||||||
window.location = 'https://ohif.org/';
|
window.location = 'https://ohif.org/';
|
||||||
},
|
},
|
||||||
healthcareApiEndpoint: 'https://idc-sandbox-002.appspot.com/v1beta1',
|
healthcareApiEndpoint: 'https://proxy-dot-idc-dev.appspot.com/v1beta1',
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import {
|
|||||||
ModalProvider,
|
ModalProvider,
|
||||||
DialogProvider,
|
DialogProvider,
|
||||||
OHIFModal,
|
OHIFModal,
|
||||||
|
ErrorBoundary
|
||||||
} from '@ohif/ui';
|
} from '@ohif/ui';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -71,6 +72,14 @@ let extensionManager;
|
|||||||
// TODO[react] Use a provider when the whole tree is React
|
// TODO[react] Use a provider when the whole tree is React
|
||||||
window.store = store;
|
window.store = store;
|
||||||
|
|
||||||
|
window.ohif = window.ohif || {};
|
||||||
|
window.ohif.app = {
|
||||||
|
commandsManager,
|
||||||
|
hotkeysManager,
|
||||||
|
servicesManager,
|
||||||
|
extensionManager,
|
||||||
|
};
|
||||||
|
|
||||||
class App extends Component {
|
class App extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
config: PropTypes.oneOfType([
|
config: PropTypes.oneOfType([
|
||||||
@ -159,6 +168,7 @@ class App extends Component {
|
|||||||
|
|
||||||
if (this._userManager) {
|
if (this._userManager) {
|
||||||
return (
|
return (
|
||||||
|
<ErrorBoundary context='App'>
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<AppProvider config={this._appConfig}>
|
<AppProvider config={this._appConfig}>
|
||||||
<I18nextProvider i18n={i18n}>
|
<I18nextProvider i18n={i18n}>
|
||||||
@ -185,10 +195,12 @@ class App extends Component {
|
|||||||
</I18nextProvider>
|
</I18nextProvider>
|
||||||
</AppProvider>
|
</AppProvider>
|
||||||
</Provider>
|
</Provider>
|
||||||
|
</ErrorBoundary>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<ErrorBoundary context='App'>
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<AppProvider config={this._appConfig}>
|
<AppProvider config={this._appConfig}>
|
||||||
<I18nextProvider i18n={i18n}>
|
<I18nextProvider i18n={i18n}>
|
||||||
@ -206,6 +218,7 @@ class App extends Component {
|
|||||||
</I18nextProvider>
|
</I18nextProvider>
|
||||||
</AppProvider>
|
</AppProvider>
|
||||||
</Provider>
|
</Provider>
|
||||||
|
</ErrorBoundary>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { Route, Switch } from 'react-router-dom';
|
|||||||
import { NProgress } from '@tanem/react-nprogress';
|
import { NProgress } from '@tanem/react-nprogress';
|
||||||
import { CSSTransition } from 'react-transition-group';
|
import { CSSTransition } from 'react-transition-group';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { ViewerbaseDragDropContext } from '@ohif/ui';
|
import { ViewerbaseDragDropContext, ErrorBoundary } from '@ohif/ui';
|
||||||
import { SignoutCallbackComponent } from 'redux-oidc';
|
import { SignoutCallbackComponent } from 'redux-oidc';
|
||||||
import asyncComponent from './components/AsyncComponent.js';
|
import asyncComponent from './components/AsyncComponent.js';
|
||||||
import * as RoutesUtil from './routes/routesUtil';
|
import * as RoutesUtil from './routes/routesUtil';
|
||||||
@ -52,10 +52,13 @@ class OHIFStandaloneViewer extends Component {
|
|||||||
const { appConfig = {} } = this.context;
|
const { appConfig = {} } = this.context;
|
||||||
const userNotLoggedIn = userManager && (!user || user.expired);
|
const userNotLoggedIn = userManager && (!user || user.expired);
|
||||||
if (userNotLoggedIn) {
|
if (userNotLoggedIn) {
|
||||||
const pathname = this.props.location.pathname;
|
const { pathname, search } = this.props.location;
|
||||||
|
|
||||||
if (pathname !== '/callback') {
|
if (pathname !== '/callback') {
|
||||||
sessionStorage.setItem('ohif-redirect-to', pathname);
|
sessionStorage.setItem(
|
||||||
|
'ohif-redirect-to',
|
||||||
|
JSON.stringify({ pathname, search })
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -103,12 +106,21 @@ class OHIFStandaloneViewer extends Component {
|
|||||||
|
|
||||||
userManager.removeUser().then(() => {
|
userManager.removeUser().then(() => {
|
||||||
if (targetLinkUri !== null) {
|
if (targetLinkUri !== null) {
|
||||||
|
const ohifRedirectTo = {
|
||||||
|
pathname: new URL(targetLinkUri).pathname,
|
||||||
|
};
|
||||||
sessionStorage.setItem(
|
sessionStorage.setItem(
|
||||||
'ohif-redirect-to',
|
'ohif-redirect-to',
|
||||||
new URL(targetLinkUri).pathname
|
JSON.stringify(ohifRedirectTo)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
sessionStorage.setItem('ohif-redirect-to', '/');
|
const ohifRedirectTo = {
|
||||||
|
pathname: '/',
|
||||||
|
};
|
||||||
|
sessionStorage.setItem(
|
||||||
|
'ohif-redirect-to',
|
||||||
|
JSON.stringify(ohifRedirectTo)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loginHint !== null) {
|
if (loginHint !== null) {
|
||||||
@ -191,7 +203,9 @@ class OHIFStandaloneViewer extends Component {
|
|||||||
{match === null ? (
|
{match === null ? (
|
||||||
<></>
|
<></>
|
||||||
) : (
|
) : (
|
||||||
|
<ErrorBoundary context={match.url}>
|
||||||
<Component match={match} location={this.props.location} />
|
<Component match={match} location={this.props.location} />
|
||||||
|
</ErrorBoundary>
|
||||||
)}
|
)}
|
||||||
</CSSTransition>
|
</CSSTransition>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -329,7 +329,9 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
|||||||
measurementApi.syncMeasurementsAndToolData();
|
measurementApi.syncMeasurementsAndToolData();
|
||||||
|
|
||||||
cornerstone.getEnabledElements().forEach(enabledElement => {
|
cornerstone.getEnabledElements().forEach(enabledElement => {
|
||||||
|
if (enabledElement.image) {
|
||||||
cornerstone.updateImage(enabledElement.element);
|
cornerstone.updateImage(enabledElement.element);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Needs to update viewports.layout state to set layout
|
// Needs to update viewports.layout state to set layout
|
||||||
|
|||||||
@ -0,0 +1,18 @@
|
|||||||
|
.ErrorBoundaryDialogTitle {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ErrorBoundaryDialogButton {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ErrorBoundaryDialogIcon {
|
||||||
|
margin-right: 5px;
|
||||||
|
width: 10px;
|
||||||
|
transform: rotate(-90deg);
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ErrorBoundaryDialogIcon.opened {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
@ -0,0 +1,72 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import classnames from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { ErrorBoundary, Icon } from '@ohif/ui';
|
||||||
|
import { servicesManager } from './../../App';
|
||||||
|
|
||||||
|
import './ErrorBoundaryDialog.css';
|
||||||
|
|
||||||
|
const { UIModalService } = servicesManager.services;
|
||||||
|
|
||||||
|
const ErrorBoundaryDialog = ({ context, children }) => {
|
||||||
|
const handleOnError = (error, componentStack) => {
|
||||||
|
const ErrorDialog = () => {
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="ErrorFallback" role="alert">
|
||||||
|
<div className="ErrorBoundaryDialog">
|
||||||
|
<h3 className="ErrorBoundaryDialogTitle">
|
||||||
|
{context}: <span>{error.message}</span>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary btn-sm ErrorBoundaryDialogButton"
|
||||||
|
onClick={() => setOpen(s => !s)}
|
||||||
|
>
|
||||||
|
<Icon
|
||||||
|
name="chevron-down"
|
||||||
|
className={classnames('ErrorBoundaryDialogIcon', {
|
||||||
|
opened: open,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
Stack Trace
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{open && <pre>{componentStack}</pre>}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
UIModalService.show({
|
||||||
|
content: ErrorDialog,
|
||||||
|
title: `Something went wrong in ${context}`,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const fallbackComponent = () => (
|
||||||
|
<div className="ErrorFallback" role="alert">
|
||||||
|
<p>
|
||||||
|
Error rendering {context}. <br /> Check the browser console for more
|
||||||
|
details.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ErrorBoundary
|
||||||
|
fallbackComponent={fallbackComponent}
|
||||||
|
context={context}
|
||||||
|
onError={handleOnError}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</ErrorBoundary>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ErrorBoundaryDialog.propTypes = {
|
||||||
|
context: PropTypes.string.isRequired,
|
||||||
|
children: PropTypes.node.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ErrorBoundaryDialog;
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
import ErrorBoundaryDialog from './ErrorBoundaryDialog';
|
||||||
|
|
||||||
|
export default ErrorBoundaryDialog;
|
||||||
@ -24,7 +24,7 @@ const ViewportGrid = function (props) {
|
|||||||
studies,
|
studies,
|
||||||
viewportData,
|
viewportData,
|
||||||
children,
|
children,
|
||||||
isStudyLoaded
|
isStudyLoaded,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
const rowSize = 100 / numRows;
|
const rowSize = 100 / numRows;
|
||||||
@ -54,7 +54,7 @@ const ViewportGrid = function (props) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [studies, viewportData, isStudyLoaded]);
|
}, [studies, viewportData, isStudyLoaded, snackbar]);
|
||||||
|
|
||||||
const getViewportPanes = () =>
|
const getViewportPanes = () =>
|
||||||
layout.viewports.map((layout, viewportIndex) => {
|
layout.viewports.map((layout, viewportIndex) => {
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { connect } from 'react-redux';
|
|||||||
import ViewerRetrieveStudyData from './ViewerRetrieveStudyData.js';
|
import ViewerRetrieveStudyData from './ViewerRetrieveStudyData.js';
|
||||||
import OHIF from '@ohif/core';
|
import OHIF from '@ohif/core';
|
||||||
|
|
||||||
const { clearViewportSpecificData } = OHIF.redux.actions;
|
const { clearViewportSpecificData, setStudyData } = OHIF.redux.actions;
|
||||||
const isActive = a => a.active === true;
|
const isActive = a => a.active === true;
|
||||||
|
|
||||||
const mapStateToProps = (state, ownProps) => {
|
const mapStateToProps = (state, ownProps) => {
|
||||||
@ -14,6 +14,9 @@ const mapStateToProps = (state, ownProps) => {
|
|||||||
};
|
};
|
||||||
const mapDispatchToProps = dispatch => {
|
const mapDispatchToProps = dispatch => {
|
||||||
return {
|
return {
|
||||||
|
setStudyData: (StudyInstanceUID, data) => {
|
||||||
|
dispatch(setStudyData(StudyInstanceUID, data));
|
||||||
|
},
|
||||||
clearViewportSpecificData: () => {
|
clearViewportSpecificData: () => {
|
||||||
dispatch(clearViewportSpecificData());
|
dispatch(clearViewportSpecificData());
|
||||||
},
|
},
|
||||||
|
|||||||
@ -2,8 +2,7 @@ import React, { Component } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import { MODULE_TYPES } from '@ohif/core';
|
import OHIF, { MODULE_TYPES, DICOMSR } from '@ohif/core';
|
||||||
import OHIF, { DICOMSR } from '@ohif/core';
|
|
||||||
import { withDialog } from '@ohif/ui';
|
import { withDialog } from '@ohif/ui';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import ConnectedHeader from './ConnectedHeader.js';
|
import ConnectedHeader from './ConnectedHeader.js';
|
||||||
@ -11,6 +10,7 @@ import ToolbarRow from './ToolbarRow.js';
|
|||||||
import ConnectedStudyBrowser from './ConnectedStudyBrowser.js';
|
import ConnectedStudyBrowser from './ConnectedStudyBrowser.js';
|
||||||
import ConnectedViewerMain from './ConnectedViewerMain.js';
|
import ConnectedViewerMain from './ConnectedViewerMain.js';
|
||||||
import SidePanel from './../components/SidePanel.js';
|
import SidePanel from './../components/SidePanel.js';
|
||||||
|
import ErrorBoundaryDialog from './../components/ErrorBoundaryDialog';
|
||||||
import { extensionManager } from './../App.js';
|
import { extensionManager } from './../App.js';
|
||||||
|
|
||||||
// Contexts
|
// Contexts
|
||||||
@ -26,6 +26,7 @@ class Viewer extends Component {
|
|||||||
PropTypes.shape({
|
PropTypes.shape({
|
||||||
StudyInstanceUID: PropTypes.string.isRequired,
|
StudyInstanceUID: PropTypes.string.isRequired,
|
||||||
StudyDate: PropTypes.string,
|
StudyDate: PropTypes.string,
|
||||||
|
PatientID: PropTypes.string,
|
||||||
displaySets: PropTypes.arrayOf(
|
displaySets: PropTypes.arrayOf(
|
||||||
PropTypes.shape({
|
PropTypes.shape({
|
||||||
displaySetInstanceUID: PropTypes.string.isRequired,
|
displaySetInstanceUID: PropTypes.string.isRequired,
|
||||||
@ -256,6 +257,7 @@ class Viewer extends Component {
|
|||||||
</WhiteLabelingContext.Consumer>
|
</WhiteLabelingContext.Consumer>
|
||||||
|
|
||||||
{/* TOOLBAR */}
|
{/* TOOLBAR */}
|
||||||
|
<ErrorBoundaryDialog context="ToolbarRow">
|
||||||
<ToolbarRow
|
<ToolbarRow
|
||||||
isLeftSidePanelOpen={this.state.isLeftSidePanelOpen}
|
isLeftSidePanelOpen={this.state.isLeftSidePanelOpen}
|
||||||
isRightSidePanelOpen={this.state.isRightSidePanelOpen}
|
isRightSidePanelOpen={this.state.isRightSidePanelOpen}
|
||||||
@ -292,6 +294,7 @@ class Viewer extends Component {
|
|||||||
}}
|
}}
|
||||||
studies={this.props.studies}
|
studies={this.props.studies}
|
||||||
/>
|
/>
|
||||||
|
</ErrorBoundaryDialog>
|
||||||
|
|
||||||
{/*<ConnectedStudyLoadingMonitor studies={this.props.studies} />*/}
|
{/*<ConnectedStudyLoadingMonitor studies={this.props.studies} />*/}
|
||||||
{/*<StudyPrefetcher studies={this.props.studies} />*/}
|
{/*<StudyPrefetcher studies={this.props.studies} />*/}
|
||||||
@ -299,6 +302,7 @@ class Viewer extends Component {
|
|||||||
{/* VIEWPORTS + SIDEPANELS */}
|
{/* VIEWPORTS + SIDEPANELS */}
|
||||||
<div className="FlexboxLayout">
|
<div className="FlexboxLayout">
|
||||||
{/* LEFT */}
|
{/* LEFT */}
|
||||||
|
<ErrorBoundaryDialog context="LeftSidePanel">
|
||||||
<SidePanel from="left" isOpen={this.state.isLeftSidePanelOpen}>
|
<SidePanel from="left" isOpen={this.state.isLeftSidePanelOpen}>
|
||||||
{VisiblePanelLeft ? (
|
{VisiblePanelLeft ? (
|
||||||
<VisiblePanelLeft
|
<VisiblePanelLeft
|
||||||
@ -313,13 +317,20 @@ class Viewer extends Component {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</SidePanel>
|
</SidePanel>
|
||||||
|
</ErrorBoundaryDialog>
|
||||||
|
|
||||||
{/* MAIN */}
|
{/* MAIN */}
|
||||||
<div className={classNames('main-content')}>
|
<div className={classNames('main-content')}>
|
||||||
<ConnectedViewerMain studies={this.props.studies} isStudyLoaded={this.props.isStudyLoaded} />
|
<ErrorBoundaryDialog context="ViewerMain">
|
||||||
|
<ConnectedViewerMain
|
||||||
|
studies={this.props.studies}
|
||||||
|
isStudyLoaded={this.props.isStudyLoaded}
|
||||||
|
/>
|
||||||
|
</ErrorBoundaryDialog>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* RIGHT */}
|
{/* RIGHT */}
|
||||||
|
<ErrorBoundaryDialog context="RightSidePanel">
|
||||||
<SidePanel from="right" isOpen={this.state.isRightSidePanelOpen}>
|
<SidePanel from="right" isOpen={this.state.isRightSidePanelOpen}>
|
||||||
{VisiblePanelRight && (
|
{VisiblePanelRight && (
|
||||||
<VisiblePanelRight
|
<VisiblePanelRight
|
||||||
@ -330,6 +341,7 @@ class Viewer extends Component {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</SidePanel>
|
</SidePanel>
|
||||||
|
</ErrorBoundaryDialog>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useEffect, useContext } from 'react';
|
import React, { useState, useEffect, useContext, useCallback } from 'react';
|
||||||
import { metadata, studies, utils, log } from '@ohif/core';
|
import { metadata, studies, utils, log } from '@ohif/core';
|
||||||
import usePrevious from '../customHooks/usePrevious';
|
import usePrevious from '../customHooks/usePrevious';
|
||||||
|
|
||||||
@ -7,13 +7,13 @@ import PropTypes from 'prop-types';
|
|||||||
import { extensionManager } from './../App.js';
|
import { extensionManager } from './../App.js';
|
||||||
import { useSnackbarContext } from '@ohif/ui';
|
import { useSnackbarContext } from '@ohif/ui';
|
||||||
|
|
||||||
|
// Contexts
|
||||||
|
import AppContext from '../context/AppContext';
|
||||||
|
|
||||||
const { OHIFStudyMetadata, OHIFSeriesMetadata } = metadata;
|
const { OHIFStudyMetadata, OHIFSeriesMetadata } = metadata;
|
||||||
const { retrieveStudiesMetadata, deleteStudyMetadataPromise } = studies;
|
const { retrieveStudiesMetadata, deleteStudyMetadataPromise } = studies;
|
||||||
const { studyMetadataManager, makeCancelable } = utils;
|
const { studyMetadataManager, makeCancelable } = utils;
|
||||||
|
|
||||||
// Contexts
|
|
||||||
import AppContext from '../context/AppContext';
|
|
||||||
|
|
||||||
const _promoteToFront = (list, value, searchMethod) => {
|
const _promoteToFront = (list, value, searchMethod) => {
|
||||||
let response = [...list];
|
let response = [...list];
|
||||||
let promoted = false;
|
let promoted = false;
|
||||||
@ -125,9 +125,14 @@ const _addSeriesToStudy = (studyMetadata, series) => {
|
|||||||
|
|
||||||
studyMetadata.createAndAddDisplaySetsForSeries(
|
studyMetadata.createAndAddDisplaySetsForSeries(
|
||||||
sopClassHandlerModules,
|
sopClassHandlerModules,
|
||||||
seriesMetadata,
|
seriesMetadata
|
||||||
);
|
);
|
||||||
|
|
||||||
study.displaySets = studyMetadata.getDisplaySets();
|
study.displaySets = studyMetadata.getDisplaySets();
|
||||||
|
study.derivedDisplaySets = studyMetadata.getDerivedDatasets({
|
||||||
|
Modality: series.Modality,
|
||||||
|
});
|
||||||
|
|
||||||
_updateStudyMetadataManager(study, studyMetadata);
|
_updateStudyMetadataManager(study, studyMetadata);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -147,6 +152,10 @@ const _updateStudyDisplaySets = (study, studyMetadata) => {
|
|||||||
study.displaySets = studyMetadata.createDisplaySets(sopClassHandlerModules);
|
study.displaySets = studyMetadata.createDisplaySets(sopClassHandlerModules);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (study.derivedDisplaySets) {
|
||||||
|
studyMetadata._addDerivedDisplaySets(study.derivedDisplaySets);
|
||||||
|
}
|
||||||
|
|
||||||
studyMetadata.setDisplaySets(study.displaySets);
|
studyMetadata.setDisplaySets(study.displaySets);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -154,11 +163,21 @@ const _sortStudyDisplaySet = (study, studyMetadata) => {
|
|||||||
studyMetadata.sortDisplaySets(study.displaySets);
|
studyMetadata.sortDisplaySets(study.displaySets);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const _thinStudyData = study => {
|
||||||
|
return {
|
||||||
|
StudyInstanceUID: study.StudyInstanceUID,
|
||||||
|
series: study.series.map(item => ({
|
||||||
|
SeriesInstanceUID: item.SeriesInstanceUID,
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
function ViewerRetrieveStudyData({
|
function ViewerRetrieveStudyData({
|
||||||
server,
|
server,
|
||||||
studyInstanceUIDs,
|
studyInstanceUIDs,
|
||||||
seriesInstanceUIDs,
|
seriesInstanceUIDs,
|
||||||
clearViewportSpecificData,
|
clearViewportSpecificData,
|
||||||
|
setStudyData,
|
||||||
}) {
|
}) {
|
||||||
// hooks
|
// hooks
|
||||||
const [error, setError] = useState(false);
|
const [error, setError] = useState(false);
|
||||||
@ -220,6 +239,7 @@ function ViewerRetrieveStudyData({
|
|||||||
if (Array.isArray(studiesData) && studiesData.length > 0) {
|
if (Array.isArray(studiesData) && studiesData.length > 0) {
|
||||||
// Map studies to new format, update metadata manager?
|
// Map studies to new format, update metadata manager?
|
||||||
const studies = studiesData.map(study => {
|
const studies = studiesData.map(study => {
|
||||||
|
setStudyData(study.StudyInstanceUID, _thinStudyData(study));
|
||||||
const studyMetadata = new OHIFStudyMetadata(
|
const studyMetadata = new OHIFStudyMetadata(
|
||||||
study,
|
study,
|
||||||
study.StudyInstanceUID
|
study.StudyInstanceUID
|
||||||
@ -265,7 +285,8 @@ function ViewerRetrieveStudyData({
|
|||||||
return loadNextSeries();
|
return loadNextSeries();
|
||||||
};
|
};
|
||||||
|
|
||||||
const concurrentRequestsAllowed = maxConcurrentMetadataRequests || studyMetadata.getSeriesCount();
|
const concurrentRequestsAllowed =
|
||||||
|
maxConcurrentMetadataRequests || studyMetadata.getSeriesCount();
|
||||||
const promises = Array(concurrentRequestsAllowed)
|
const promises = Array(concurrentRequestsAllowed)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map(loadNextSeries);
|
.map(loadNextSeries);
|
||||||
@ -311,7 +332,7 @@ function ViewerRetrieveStudyData({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const purgeCancellablePromises = () => {
|
const purgeCancellablePromises = useCallback(() => {
|
||||||
for (let studyInstanceUIDs in cancelableStudiesPromises) {
|
for (let studyInstanceUIDs in cancelableStudiesPromises) {
|
||||||
if ('cancel' in cancelableStudiesPromises[studyInstanceUIDs]) {
|
if ('cancel' in cancelableStudiesPromises[studyInstanceUIDs]) {
|
||||||
cancelableStudiesPromises[studyInstanceUIDs].cancel();
|
cancelableStudiesPromises[studyInstanceUIDs].cancel();
|
||||||
@ -325,7 +346,7 @@ function ViewerRetrieveStudyData({
|
|||||||
studyMetadataManager.remove(studyInstanceUIDs);
|
studyMetadataManager.remove(studyInstanceUIDs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
const prevStudyInstanceUIDs = usePrevious(studyInstanceUIDs);
|
const prevStudyInstanceUIDs = usePrevious(studyInstanceUIDs);
|
||||||
|
|
||||||
@ -339,7 +360,7 @@ function ViewerRetrieveStudyData({
|
|||||||
studyMetadataManager.purge();
|
studyMetadataManager.purge();
|
||||||
purgeCancellablePromises();
|
purgeCancellablePromises();
|
||||||
}
|
}
|
||||||
}, [studyInstanceUIDs]);
|
}, [prevStudyInstanceUIDs, purgeCancellablePromises, studyInstanceUIDs]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
cancelableSeriesPromises = {};
|
cancelableSeriesPromises = {};
|
||||||
@ -369,6 +390,7 @@ ViewerRetrieveStudyData.propTypes = {
|
|||||||
seriesInstanceUIDs: PropTypes.array,
|
seriesInstanceUIDs: PropTypes.array,
|
||||||
server: PropTypes.object,
|
server: PropTypes.object,
|
||||||
clearViewportSpecificData: PropTypes.func.isRequired,
|
clearViewportSpecificData: PropTypes.func.isRequired,
|
||||||
|
setStudyData: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ViewerRetrieveStudyData;
|
export default ViewerRetrieveStudyData;
|
||||||
|
|||||||
@ -1,49 +1,44 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Modal from 'react-bootstrap-modal';
|
|
||||||
import DicomUploader from './DicomUploader';
|
import DicomUploader from './DicomUploader';
|
||||||
import { withTranslation } from 'react-i18next';
|
import { withTranslation } from 'react-i18next';
|
||||||
|
import { servicesManager } from './../App.js';
|
||||||
|
|
||||||
class DicomFileUploaderModal extends Component {
|
function DicomFileUploaderModal({
|
||||||
static propTypes = {
|
isOpen = false,
|
||||||
url: PropTypes.string,
|
onClose,
|
||||||
retrieveAuthHeaderFunction: PropTypes.func,
|
url,
|
||||||
onClose: PropTypes.func,
|
retrieveAuthHeaderFunction,
|
||||||
};
|
t,
|
||||||
|
}) {
|
||||||
|
const { UIModalService } = servicesManager.services;
|
||||||
|
|
||||||
state = {
|
const showDicomStorePickerModal = () => {
|
||||||
uploaded: false,
|
if (!UIModalService) {
|
||||||
};
|
return
|
||||||
|
|
||||||
render() {
|
|
||||||
if (!this.props.url) {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UIModalService.show({
|
||||||
|
content: DicomUploader,
|
||||||
|
title: t('Upload DICOM Files'),
|
||||||
|
contentProps: {
|
||||||
|
url,
|
||||||
|
retrieveAuthHeaderFunction
|
||||||
|
},
|
||||||
|
onClose,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<React.Fragment>{isOpen && showDicomStorePickerModal()}</React.Fragment>
|
||||||
show={this.props.isOpen}
|
|
||||||
onHide={this.props.onClose}
|
|
||||||
aria-labelledby="ModalHeader"
|
|
||||||
className="modal fade themed in"
|
|
||||||
backdrop={false}
|
|
||||||
size={'md'}
|
|
||||||
keyboard={true}
|
|
||||||
>
|
|
||||||
<Modal.Header closeButton>
|
|
||||||
<Modal.Title>
|
|
||||||
{this.props.t('Upload DICOM Files')}
|
|
||||||
</Modal.Title>
|
|
||||||
</Modal.Header>
|
|
||||||
<Modal.Body>
|
|
||||||
<DicomUploader
|
|
||||||
url={this.props.url}
|
|
||||||
retrieveAuthHeaderFunction={this.props.retrieveAuthHeaderFunction}
|
|
||||||
/>
|
|
||||||
</Modal.Body>
|
|
||||||
</Modal>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
DicomFileUploaderModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool.isRequired,
|
||||||
|
retrieveAuthHeaderFunction: PropTypes.func.isRequired,
|
||||||
|
onClose: PropTypes.func,
|
||||||
|
url: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
export default withTranslation('Common')(DicomFileUploaderModal);
|
export default withTranslation('Common')(DicomFileUploaderModal);
|
||||||
|
|||||||
@ -36,6 +36,7 @@ function DicomStorePickerModal({
|
|||||||
user,
|
user,
|
||||||
url,
|
url,
|
||||||
},
|
},
|
||||||
|
onClose
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -14,9 +14,11 @@ class CallbackPage extends Component {
|
|||||||
<CallbackComponent
|
<CallbackComponent
|
||||||
userManager={this.props.userManager}
|
userManager={this.props.userManager}
|
||||||
successCallback={() => {
|
successCallback={() => {
|
||||||
const pathname = sessionStorage.getItem('ohif-redirect-to');
|
const { pathname, search = '' } = JSON.parse(
|
||||||
|
sessionStorage.getItem('ohif-redirect-to')
|
||||||
|
);
|
||||||
|
|
||||||
this.props.history.push(pathname);
|
this.props.history.push({ pathname, search });
|
||||||
}}
|
}}
|
||||||
errorCallback={error => {
|
errorCallback={error => {
|
||||||
//this.props.history.push("/");
|
//this.props.history.push("/");
|
||||||
|
|||||||
103
yarn.lock
103
yarn.lock
@ -1247,13 +1247,34 @@
|
|||||||
pirates "^4.0.0"
|
pirates "^4.0.0"
|
||||||
source-map-support "^0.5.9"
|
source-map-support "^0.5.9"
|
||||||
|
|
||||||
"@babel/runtime@7.1.2", "@babel/runtime@7.5.5", "@babel/runtime@7.6.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
|
"@babel/runtime@7.1.2":
|
||||||
|
version "7.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3"
|
||||||
|
integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.12.0"
|
||||||
|
|
||||||
|
"@babel/runtime@7.6.0":
|
||||||
|
version "7.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205"
|
||||||
|
integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
|
||||||
version "7.5.5"
|
version "7.5.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
||||||
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.2"
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.6":
|
||||||
|
version "7.10.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
|
||||||
|
integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
|
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
|
||||||
version "7.6.0"
|
version "7.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
|
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
|
||||||
@ -4992,6 +5013,11 @@ cfb@^1.1.0:
|
|||||||
crc-32 "~1.2.0"
|
crc-32 "~1.2.0"
|
||||||
printj "~1.1.2"
|
printj "~1.1.2"
|
||||||
|
|
||||||
|
chain-function@^1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc"
|
||||||
|
integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==
|
||||||
|
|
||||||
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
|
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||||
@ -6534,10 +6560,10 @@ dateformat@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
|
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
|
||||||
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
|
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
|
||||||
|
|
||||||
dcmjs@^0.12.2:
|
dcmjs@0.16.0:
|
||||||
version "0.12.2"
|
version "0.16.0"
|
||||||
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.12.2.tgz#1c16e19c27ff43202abc7cd25c5ecd6d8bf7672e"
|
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.16.0.tgz#714755d006c3a49cf65ef13e627ff7a23151d35a"
|
||||||
integrity sha512-B7cEVCfDi3mOLKoBYUMYy+6COjLZhtKaesNpq5XNA4IbEH4EJYVweJfiI9gsR5hypv9LAPg72xG/xrbqjy8TgQ==
|
integrity sha512-41nY3Isg5i5FoSd1s67aUgUHi146r+fb8JuiRvDsxvm7MEkkdjIzMYMtxjsrVwKRW1xRH+x34nxbV9+8cc7WQw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/polyfill" "^7.8.3"
|
"@babel/polyfill" "^7.8.3"
|
||||||
"@babel/runtime" "^7.8.4"
|
"@babel/runtime" "^7.8.4"
|
||||||
@ -7247,7 +7273,7 @@ dom-converter@^0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
utila "~0.4"
|
utila "~0.4"
|
||||||
|
|
||||||
dom-helpers@^3.2.1, dom-helpers@^3.3.1, dom-helpers@^3.4.0:
|
dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.3.1, dom-helpers@^3.4.0:
|
||||||
version "3.4.0"
|
version "3.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
|
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
|
||||||
integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
|
integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
|
||||||
@ -15293,13 +15319,13 @@ prop-types-exact@^1.2.0:
|
|||||||
object.assign "^4.1.0"
|
object.assign "^4.1.0"
|
||||||
reflect.ownkeys "^0.2.0"
|
reflect.ownkeys "^0.2.0"
|
||||||
|
|
||||||
prop-types-extra@^1.0.1, prop-types-extra@^1.1.0:
|
prop-types-extra@^1.0.1, prop-types-extra@^1.1.1:
|
||||||
version "1.1.0"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz#32609910ea2dcf190366bacd3490d5a6412a605f"
|
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
|
||||||
integrity sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==
|
integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
|
||||||
dependencies:
|
dependencies:
|
||||||
react-is "^16.3.2"
|
react-is "^16.3.2"
|
||||||
warning "^3.0.0"
|
warning "^4.0.0"
|
||||||
|
|
||||||
prop-types@15.6.2:
|
prop-types@15.6.2:
|
||||||
version "15.6.2"
|
version "15.6.2"
|
||||||
@ -15586,27 +15612,15 @@ re-resizable@^4.11.0:
|
|||||||
resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-4.11.0.tgz#d5df10bda445c4ec0945751a223bf195afb61890"
|
resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-4.11.0.tgz#d5df10bda445c4ec0945751a223bf195afb61890"
|
||||||
integrity sha512-dye+7rERqNf/6mDT1iwps+4Gf42420xuZgygF33uX178DxffqcyeuHbBuJ382FIcB5iP6mMZOhfW7kI0uXwb/Q==
|
integrity sha512-dye+7rERqNf/6mDT1iwps+4Gf42420xuZgygF33uX178DxffqcyeuHbBuJ382FIcB5iP6mMZOhfW7kI0uXwb/Q==
|
||||||
|
|
||||||
react-bootstrap-modal@4.2.0:
|
|
||||||
version "4.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-bootstrap-modal/-/react-bootstrap-modal-4.2.0.tgz#010b3ca9230a3c147fa5fc6aa39b6971e34151bd"
|
|
||||||
integrity sha512-2Xx9yvPEnMNhJIAKCg+t3CECF6w3qt2mmICv1Y1vwDBHeuyyf3OvSFcnRM8E0Tn7pywgopL2qyU4yx0vnGKmdA==
|
|
||||||
dependencies:
|
|
||||||
classnames "^2.2.6"
|
|
||||||
dom-helpers "^3.3.1"
|
|
||||||
prop-types "^15.6.1"
|
|
||||||
prop-types-extra "^1.1.0"
|
|
||||||
react-overlays "^0.8.0"
|
|
||||||
react-transition-group "^2.0.0"
|
|
||||||
|
|
||||||
react-codemirror2@^6.0.0:
|
react-codemirror2@^6.0.0:
|
||||||
version "6.0.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-6.0.0.tgz#180065df57a64026026cde569a9708fdf7656525"
|
resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-6.0.0.tgz#180065df57a64026026cde569a9708fdf7656525"
|
||||||
integrity sha512-D7y9qZ05FbUh9blqECaJMdDwKluQiO3A9xB+fssd5jKM7YAXucRuEOlX32mJQumUvHUkHRHqXIPBjm6g0FW0Ag==
|
integrity sha512-D7y9qZ05FbUh9blqECaJMdDwKluQiO3A9xB+fssd5jKM7YAXucRuEOlX32mJQumUvHUkHRHqXIPBjm6g0FW0Ag==
|
||||||
|
|
||||||
react-cornerstone-viewport@2.3.8:
|
react-cornerstone-viewport@2.3.9:
|
||||||
version "2.3.8"
|
version "2.3.9"
|
||||||
resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-2.3.8.tgz#7af8360f29bca986ae4e36b4e503269b88ddc52f"
|
resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-2.3.9.tgz#f9761da8e536f0a217137c6ca1a983f5882249f9"
|
||||||
integrity sha512-aiG2uVNrDY6SQx4t/HBxIA3zsMsCwT+6TpcXK9qSSoXhs+X6OTmYEKncWUqL0jtxU1yfh6JTUz8ARTg03gtF+A==
|
integrity sha512-qrhq8CbX/jq6b93cQjV2qC/mhHOvFBpxzxcHlvHzEQZt/rmRMcaYxCqjpNaNbUmmBu61wNkxesUVsggkPTTcqg==
|
||||||
dependencies:
|
dependencies:
|
||||||
classnames "^2.2.6"
|
classnames "^2.2.6"
|
||||||
date-fns "^2.2.1"
|
date-fns "^2.2.1"
|
||||||
@ -15796,6 +15810,13 @@ react-dropzone@^10.1.7:
|
|||||||
file-selector "^0.1.11"
|
file-selector "^0.1.11"
|
||||||
prop-types "^15.7.2"
|
prop-types "^15.7.2"
|
||||||
|
|
||||||
|
react-error-boundary@^2.2.1:
|
||||||
|
version "2.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-2.2.1.tgz#32ed74386a90482060cc2fea948bb7135465c4cb"
|
||||||
|
integrity sha512-8SZMkJRFUb0JuluHKwuUtkh5vvVWBg3O/bJIWgNMhMJv529aG//TmcphR3cSMhCWjz1vFZDb4taJd6pmwP5mEQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.9.6"
|
||||||
|
|
||||||
react-error-overlay@^4.0.1:
|
react-error-overlay@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.1.tgz#417addb0814a90f3a7082eacba7cee588d00da89"
|
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.1.tgz#417addb0814a90f3a7082eacba7cee588d00da89"
|
||||||
@ -15852,7 +15873,12 @@ react-input-autosize@^2.2.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prop-types "^15.5.8"
|
prop-types "^15.5.8"
|
||||||
|
|
||||||
react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
|
react-is@^16.3.2:
|
||||||
|
version "16.13.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||||
|
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||||
|
|
||||||
|
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
|
||||||
version "16.11.0"
|
version "16.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa"
|
||||||
integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==
|
integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==
|
||||||
@ -16009,7 +16035,19 @@ react-simple-code-editor@^0.9.0:
|
|||||||
resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.9.15.tgz#59e3583832e9e98992d3674b2d7673b4cd1c5709"
|
resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.9.15.tgz#59e3583832e9e98992d3674b2d7673b4cd1c5709"
|
||||||
integrity sha512-M8iKgjBTBZK92tZYgOEfMuR7c3zZ0q0v3QYllSxIPx3SU+w003VofH50txXQSBTu92pSOm2tidON1HbQ1l8BDA==
|
integrity sha512-M8iKgjBTBZK92tZYgOEfMuR7c3zZ0q0v3QYllSxIPx3SU+w003VofH50txXQSBTu92pSOm2tidON1HbQ1l8BDA==
|
||||||
|
|
||||||
react-transition-group@^2.0.0, react-transition-group@^2.2.0, react-transition-group@^2.2.1:
|
react-transition-group@2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.0.0.tgz#e882e61fce8622ed981b6e31fc7ef52d43a1a06a"
|
||||||
|
integrity sha1-6ILmH86GIu2YG24x/H71LUOhoGo=
|
||||||
|
dependencies:
|
||||||
|
chain-function "^1.0.0"
|
||||||
|
classnames "^2.2.5"
|
||||||
|
dom-helpers "^3.2.0"
|
||||||
|
loose-envify "^1.3.1"
|
||||||
|
prop-types "^15.5.8"
|
||||||
|
warning "^3.0.0"
|
||||||
|
|
||||||
|
react-transition-group@^2.2.0, react-transition-group@^2.2.1:
|
||||||
version "2.9.0"
|
version "2.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
|
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
|
||||||
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
|
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
|
||||||
@ -16395,6 +16433,11 @@ regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1:
|
|||||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
|
||||||
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
|
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
|
||||||
|
|
||||||
|
regenerator-runtime@^0.12.0:
|
||||||
|
version "0.12.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
|
||||||
|
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
|
||||||
|
|
||||||
regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4:
|
regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4:
|
||||||
version "0.13.5"
|
version "0.13.5"
|
||||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
|
||||||
@ -19715,7 +19758,7 @@ warning@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify "^1.0.0"
|
loose-envify "^1.0.0"
|
||||||
|
|
||||||
warning@^4.0.3:
|
warning@^4.0.0, warning@^4.0.3:
|
||||||
version "4.0.3"
|
version "4.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
|
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
|
||||||
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
|
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user