diff --git a/OHIFViewer-react/package.json b/OHIFViewer-react/package.json index 16243cafe..99a1ceb97 100644 --- a/OHIFViewer-react/package.json +++ b/OHIFViewer-react/package.json @@ -12,13 +12,17 @@ "hammerjs": "^2.0.8", "lodash.debounce": "^4.0.8", "moment": "^2.22.2", + "ohif-core": "^0.1.0", "prop-types": "^15.6.2", "react": "^16.4.1", "react-cornerstone-viewport": "^0.1.1", "react-dom": "^16.4.1", + "react-redux": "^6.0.0", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", "react-scripts": "^2.1.1", "react-viewerbase": "^0.1.2", - "ohif-core": "link:/Users/Erik/Projects/OHIF/ohif-core" + "redux": "^4.0.1" }, "scripts": { "copy:webworkers": "cp node_modules/cornerstone-wado-image-loader/dist/*.min.js* public", diff --git a/OHIFViewer-react/src/App.js b/OHIFViewer-react/src/App.js index 15d490f91..edcece569 100644 --- a/OHIFViewer-react/src/App.js +++ b/OHIFViewer-react/src/App.js @@ -1,13 +1,12 @@ import React, { Component } from 'react'; import { withRouter } from 'react-router'; import { Route, Switch } from 'react-router-dom'; -import { OHIF } from 'ohif-core'; import ViewerRouting from "./ViewerRouting.js"; import IHEInvokeImageDisplay from './IHEInvokeImageDisplay.js'; import './App.css'; +import { StudyList } from 'react-viewerbase'; const reload = () => window.location.reload(); -const Studylist = OHIF.studylist.components.StudyList; function setContext(context) { /*Rollbar.configure({ @@ -24,7 +23,7 @@ class App extends Component { window.router = { history: this.props.history }; - + this.unlisten = this.props.history.listen((location, action) => { setContext(window.location.pathname); }); @@ -40,14 +39,14 @@ class App extends Component { @@ -70,8 +69,8 @@ class App extends Component { store={this.props.store} /> - {/* - */} + +
Sorry, this page does not exist.
} /> diff --git a/OHIFViewer-react/src/ConnectedViewerFromStudyData.js b/OHIFViewer-react/src/ConnectedViewerFromStudyData.js new file mode 100644 index 000000000..d4c72d99f --- /dev/null +++ b/OHIFViewer-react/src/ConnectedViewerFromStudyData.js @@ -0,0 +1,21 @@ +import { connect } from 'react-redux'; + +import ViewerFromStudyData from './ViewerFromStudyData.js'; + +const isActive = (a) => a.active === true; + +const mapStateToProps = (state, ownProps) => { + const activeServer = state.servers.servers.find(isActive); + + return { + server: activeServer, + ...ownProps + }; +}; + +const ConnectedViewerFromStudyData = connect( + mapStateToProps, + null +)(ViewerFromStudyData); + +export default ConnectedViewerFromStudyData; diff --git a/OHIFViewer-react/src/IHEInvokeImageDisplay.js b/OHIFViewer-react/src/IHEInvokeImageDisplay.js index 7429a4552..ed8cbc116 100644 --- a/OHIFViewer-react/src/IHEInvokeImageDisplay.js +++ b/OHIFViewer-react/src/IHEInvokeImageDisplay.js @@ -1,12 +1,13 @@ -import React, { Component } from "react"; +import React from "react"; import PropTypes from "prop-types"; import ViewerFromStudyData from "./ViewerFromStudyData.js"; function IHEInvokeImageDisplay({ match }) { const requestType = match.params.query.requestType; - let studyInstanceUids; + let patientUids; let displayStudyList = false; + if (requestType === "STUDY") { studyInstanceUids = match.params.query.studyUID.split(';'); } else if (requestType === "STUDYBASE64") { @@ -14,15 +15,14 @@ function IHEInvokeImageDisplay({ match }) { const decodedData = window.atob(uids); studyInstanceUids = decodedData.split(';'); } else if (requestType === "PATIENT") { - const patientUids = this.params.query.patientID.split(';'); + patientUids = this.params.query.patientID.split(';'); displayStudyList = true } else { displayStudyList = true } if (displayStudyList) { - //return (); - return (''); + return ('')//); } return ( @@ -30,4 +30,16 @@ function IHEInvokeImageDisplay({ match }) { ); } +IHEInvokeImageDisplay.propTypes = { + match: PropTypes.shape({ + params: PropTypes.shape({ + query: PropTypes.shape({ + requestType: PropTypes.string.isRequired, + studyUID: PropTypes.string, + patientID: PropTypes.string + }) + }) + }) +}; + export default IHEInvokeImageDisplay; diff --git a/OHIFViewer-react/src/ViewerFromStudyData.js b/OHIFViewer-react/src/ViewerFromStudyData.js index 072302a62..60be80296 100644 --- a/OHIFViewer-react/src/ViewerFromStudyData.js +++ b/OHIFViewer-react/src/ViewerFromStudyData.js @@ -1,43 +1,44 @@ import React, {Component} from "react"; import PropTypes from "prop-types"; import Viewer from "./viewer/viewer.js"; -import { OHIF } from 'ohif-core'; +import OHIF from 'ohif-core'; +import { sortingManager } from './lib/sortingManager.js'; +import { updateMetaDataManager } from './lib/updateMetaDataManager.js'; // TODO: Move to react-viewerbase - function createDisplaySets(studies) { // Define the OHIF.viewer.data global object // TODO: Save all data that is currently in OHIF.viewer in redux instead - OHIF.viewer.data = OHIF.viewer.data || {}; + //OHIF.viewer.data = OHIF.viewer.data || {}; // @TypeSafeStudies // Clears OHIF.viewer.Studies collection - OHIF.viewer.Studies.removeAll(); + //OHIF.viewer.Studies.removeAll(); // @TypeSafeStudies // Clears OHIF.viewer.StudyMetadataList collection - OHIF.viewer.StudyMetadataList.removeAll(); + //OHIF.viewer.StudyMetadataList.removeAll(); - OHIF.viewer.data.studyInstanceUids = []; + //OHIF.viewer.data.studyInstanceUids = []; const updatedStudies = studies.map(study => { const studyMetadata = new OHIF.metadata.OHIFStudyMetadata(study, study.studyInstanceUid); let displaySets = study.displaySets; if (!study.displaySets) { - displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata); + displaySets = sortingManager.getDisplaySets(studyMetadata); study.displaySets = displaySets; } studyMetadata.setDisplaySets(displaySets); study.selected = true; - OHIF.viewer.Studies.insert(study); - OHIF.viewer.StudyMetadataList.insert(studyMetadata); - OHIF.viewer.data.studyInstanceUids.push(study.studyInstanceUid); + //OHIF.viewer.Studies.insert(study); + //OHIF.viewer.StudyMetadataList.insert(studyMetadata); + //OHIF.viewer.data.studyInstanceUids.push(study.studyInstanceUid); // Updates WADO-RS metaDataManager - OHIF.viewerbase.updateMetaDataManager(study); + updateMetaDataManager(study); return study; }); @@ -58,16 +59,11 @@ class ViewerFromStudyData extends Component { componentDidMount() { // TODO: Avoid using timepoints here //const params = { studyInstanceUids, seriesInstanceUids, timepointId, timepointsFilter={} }; - const params = { - studyInstanceUids: this.props.studyInstanceUids, - seriesInstanceUids: this.props.seriesInstanceUids, - } - const promise = OHIF.viewerbase.prepareViewerData(params); + const { studyInstanceUids, seriesInstanceUids, server } = this.props; + const promise = OHIF.studies.retrieveStudiesMetadata(server, studyInstanceUids, seriesInstanceUids) // Render the viewer when the data is ready - promise.then(({ studies, viewerData }) => { - OHIF.viewer.data = viewerData; - + promise.then(studies => { const updatedStudies = createDisplaySets(studies); this.setState({ @@ -75,8 +71,10 @@ class ViewerFromStudyData extends Component { }); }).catch(error => { this.setState({ - error, + error: true, }); + + console.error(error); }); } @@ -96,7 +94,8 @@ class ViewerFromStudyData extends Component { ViewerFromStudyData.propTypes = { studyInstanceUids: PropTypes.array.isRequired, - seriesInstanceUids: PropTypes.array + seriesInstanceUids: PropTypes.array, + server: PropTypes.object }; export default ViewerFromStudyData; diff --git a/OHIFViewer-react/src/ViewerRouting.js b/OHIFViewer-react/src/ViewerRouting.js index 189eca4c0..adccf2a3c 100644 --- a/OHIFViewer-react/src/ViewerRouting.js +++ b/OHIFViewer-react/src/ViewerRouting.js @@ -1,6 +1,6 @@ -import React, {Component} from "react"; +import React from "react"; import PropTypes from "prop-types"; -import ViewerFromStudyData from "./ViewerFromStudyData.js"; +import ConnectedViewerFromStudyData from "./ConnectedViewerFromStudyData"; // TODO: Move to react-viewerbase @@ -18,7 +18,7 @@ function ViewerRouting({ match }) { } return ( - + ); } diff --git a/OHIFViewer-react/src/config.js b/OHIFViewer-react/src/config.js index d499a9640..0b49e664b 100644 --- a/OHIFViewer-react/src/config.js +++ b/OHIFViewer-react/src/config.js @@ -1,25 +1,38 @@ -import { OHIF } from 'ohif-core'; +import dicomParser from 'dicom-parser'; +import cornerstone from 'cornerstone-core'; import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'; +import cornerstoneMath from 'cornerstone-math'; +import cornerstoneTools from 'cornerstone-tools'; +import Hammer from 'hammerjs'; +import OHIF from 'ohif-core'; import sha from './sha.js'; import version from './version.js'; -OHIF.info = { +window.info = { sha, version }; +cornerstoneTools.external.cornerstone = cornerstone; +cornerstoneTools.external.Hammer = Hammer; +cornerstoneTools.external.cornerstoneMath = cornerstoneMath; +cornerstoneTools.init(); -const maxWebWorkers = Math.max(navigator.hardwareConcurrency - 1, 1); +cornerstoneWADOImageLoader.external.cornerstone = cornerstone; +cornerstoneWADOImageLoader.external.dicomParser = dicomParser; + +// TODO: find a better way to get app root URL other than window.location.origin const config = { - maxWebWorkers, + maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1), startWebWorkersOnDemand: true, - webWorkerPath: OHIF.utils.absoluteUrl('packages/ohif_cornerstone/public/js/cornerstoneWADOImageLoaderWebWorker.es5.js'), + webWorkerPath: window.location.origin + '/cornerstoneWADOImageLoaderWebWorker.min.js', taskConfiguration: { decodeTask: { loadCodecsOnStartup: true, initializeCodecsOnStartup: false, - codecsPath: OHIF.utils.absoluteUrl('packages/ohif_cornerstone/public/js/cornerstoneWADOImageLoaderCodecs.es5.js'), - usePDFJS: false + codecsPath: window.location.origin + '/cornerstoneWADOImageLoaderCodecs.min.js', + usePDFJS: false, + strict: false } } }; @@ -35,3 +48,19 @@ cornerstoneWADOImageLoader.configure({ } } }); + +// Set the tool font and font size +// context.font = "[style] [variant] [weight] [size]/[line height] [font family]"; +const fontFamily = + 'Work Sans, Roboto, OpenSans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif'; +cornerstoneTools.textStyle.setFont(`16px ${fontFamily}`); + +// Set the tool width +cornerstoneTools.toolStyle.setToolWidth(2); +// Set color for inactive tools +cornerstoneTools.toolColors.setToolColor('rgb(255, 255, 0)'); + +// Set color for active tools +cornerstoneTools.toolColors.setActiveColor('rgb(0, 255, 0)'); + +cornerstoneTools.store.state.touchProximity = 40; diff --git a/OHIFViewer-react/src/flexboxLayout/ConnectedCornerstoneViewport.js b/OHIFViewer-react/src/flexboxLayout/ConnectedCornerstoneViewport.js new file mode 100644 index 000000000..2c2599b5c --- /dev/null +++ b/OHIFViewer-react/src/flexboxLayout/ConnectedCornerstoneViewport.js @@ -0,0 +1,28 @@ +import { connect } from 'react-redux'; +import CornerstoneViewport from 'react-cornerstone-viewport'; +import OHIF from 'ohif-core' + +const { setViewportActive } = OHIF.redux.actions; + +const mapStateToProps = state => { + return { + activeViewportIndex: state.viewports.activeViewportIndex, + activeTool: state.tools.buttons.find(tool => tool.active === true).command + }; +}; + +const mapDispatchToProps = dispatch => { + return { + setViewportActive: viewportIndex => { + console.log(`setViewportActive: ${viewportIndex}`); + dispatch(setViewportActive(viewportIndex)) + } + }; +}; + +const ConnectedCornerstoneViewport = connect( + mapStateToProps, + mapDispatchToProps +)(CornerstoneViewport); + +export default ConnectedCornerstoneViewport; diff --git a/OHIFViewer-react/src/flexboxLayout/ViewerMain.js b/OHIFViewer-react/src/flexboxLayout/ViewerMain.js new file mode 100644 index 000000000..7368b0e45 --- /dev/null +++ b/OHIFViewer-react/src/flexboxLayout/ViewerMain.js @@ -0,0 +1,142 @@ +import { Component } from 'react'; +import React from 'react'; +import PropTypes from 'prop-types'; +import cornerstone from 'cornerstone-core'; +import cornerstoneTools from 'cornerstone-tools'; +import { LayoutManager } from 'react-viewerbase'; +import { OHIF } from 'ohif-core'; +import ConnectedCornerstoneViewport from './ConnectedCornerstoneViewport.js'; +import StackManager from '../lib/StackManager.js'; +import './ViewerMain.styl'; + +//const { StudyLoadingListener, StudyPrefetcher, ResizeViewportManager } = OHIF.classes; + + +//window.ResizeViewportManager = window.ResizeViewportManager || new ResizeViewportManager(); + +function getCornerstoneStack(studies, viewportData) { + const { + displaySetInstanceUid, + studyInstanceUid, + } = viewportData; + + // Create shortcut to displaySet + const study = studies.find(study => study.studyInstanceUid === studyInstanceUid); + + const displaySet = study.displaySets.find((set) => { + return set.displaySetInstanceUid === displaySetInstanceUid; + }); + + // Get stack from Stack Manager + const stack = StackManager.findOrCreateStack(study, displaySet); + stack.currentImageIdIndex = 0; + + return stack; +} + +class ViewerMain extends Component { + constructor(props) { + super(props); + + this.state = { + displaySets: [] + }; + + this.getCornerstoneViewport = this.getCornerstoneViewport.bind(this); + } + + componentDidMount() { + // Attach the Window resize listener + // Don't use jQuery here. "window.onresize" will always be null + // If its necessary, check all the code for window.onresize getter + // and change it to jQuery._data(window, 'events')['resize']. + // Otherwise this function will be probably overrided. + // See cineDialog instance.setResizeHandler function + //window.addEventListener('resize', window.ResizeViewportManager.getResizeHandler()); + + // Add beforeUnload event handler to check for unsaved changes + //window.addEventListener('beforeunload', unloadHandlers.beforeUnload); + + const { studies } = this.props; + //this.studyPrefetcher = StudyPrefetcher.getInstance(); + //this.studyPrefetcher.setStudies(studies); + //this.studyLoadingListener = StudyLoadingListener.getInstance(); + //this.studyLoadingListener.clear(); + //this.studyLoadingListener.addStudies(studies); + + // Get all the display sets for the viewer studies + const displaySets = []; + studies.forEach((study) => { + study.displaySets.forEach(dSet => dSet.images.length && displaySets.push(dSet)); + }); + + this.setState({ + displaySets + }); + + debugger; + } + + getCornerstoneViewport(data, index) { + const stack = getCornerstoneStack(this.props.studies, data) + const viewportData = { + stack, + ...data + }; + + return (); + }; + + render() { + // TODO: re-add plugins back in + const viewportData = this.state.displaySets.map((dSet, index) => { + return this.getCornerstoneViewport(dSet, index); + }) + + // TODO: Connect LayoutManager to redux + return ( +
+ +
+ ); + } + + componentWillUnmount() { + // Remove the Window resize listener + //window.removeEventListener('resize', window.ResizeViewportManager.getResizeHandler()); + + // Remove beforeUnload event handler... + //window.removeEventListener('beforeunload', unloadHandlers.beforeUnload); + + // Destroy the synchronizer used to update reference lines + OHIF.viewer.updateImageSynchronizer.destroy(); + + // Stop prefetching when we close the viewer + //this.studyPrefetcher.destroy(); + + // Destroy stack loading listeners when we close the viewer + //this.studyLoadingListener.clear(); + + // Clear references to all stacks in the StackManager + //OHIF.viewerbase.stackManager.clearStacks(); + + // @TypeSafeStudies + // Clears OHIF.viewer.Studies collection + //OHIF.viewer.Studies.removeAll(); + + // @TypeSafeStudies + // Clears OHIF.viewer.StudyMetadataList collection + //OHIF.viewer.StudyMetadataList.removeAll(); + } +} + +ViewerMain.propTypes = { + studies: PropTypes.array.isRequired +}; + +export default ViewerMain; diff --git a/OHIFViewer-react/src/flexboxLayout/ViewerMain.styl b/OHIFViewer-react/src/flexboxLayout/ViewerMain.styl new file mode 100644 index 000000000..217e089e8 --- /dev/null +++ b/OHIFViewer-react/src/flexboxLayout/ViewerMain.styl @@ -0,0 +1,34 @@ +@import "{ohif:viewerbase}/app" + +#viewer + height: "calc(100% - %s)" % $topBarHeight + + &>.loadingTextDiv + //theme('color', '$textSecondaryColor') + font-size: 30px + height: 100% + line-height: "calc(100% - %s)" % $topBarHeight + +.ViewerMain + width: 100% + height: 100% + //transition(all 0.3s ease) + + #imageViewerViewports + .viewportContainer + //theme('border', '%s solid $uiBorderColorDark' % $viewportBorderThickness) + float: left + position: relative + + outline: 0 // Prevent blue outline in Chrome + + &:hover + &.active + &:hover.active + outline: 0 // Prevent blue outline in Chrome + + &:hover + //theme('border', '%s solid $uiBorderColor' % $viewportBorderThickness) + + &.active, &:hover.active + //theme('border', '%s solid $uiBorderColorActive' % $viewportBorderThickness) diff --git a/OHIFViewer-react/src/flexboxLayout/flexboxLayout.js b/OHIFViewer-react/src/flexboxLayout/flexboxLayout.js index ea38e394e..c9114b99d 100644 --- a/OHIFViewer-react/src/flexboxLayout/flexboxLayout.js +++ b/OHIFViewer-react/src/flexboxLayout/flexboxLayout.js @@ -1,8 +1,10 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { OHIF } from 'ohif-core'; -import { StudyBrowser } from 'react-viewerbase'; +import OHIF from 'ohif-core'; import cornerstone from 'cornerstone-core'; +import { StudyBrowser } from 'react-viewerbase'; +import ViewerMain from './ViewerMain.js'; +// TODO: Where should we put ViewerMain? ohif-core or react-viewerbase? /** * Asynchronous wrapper around Cornerstone's renderToCanvas method. @@ -51,7 +53,8 @@ const loadError = function(error, studyInstanceUid, displaySetInstanceUid) { const study = studies.find(study => study.studyInstanceUid === studyInstanceUid); const thumbnail = study.thumbnails.find(t => t.displaySetInstanceUid === displaySetInstanceUid); - thumbnail.error = error; + thumbnail.error = true; + //thumbnail.details = error; this.setState({ studiesForBrowser: studies @@ -95,11 +98,7 @@ class FlexboxLayout extends Component { } getStudiesForBrowser() { - // @TypeSafeStudies - const studies = OHIF.viewer.Studies.findAllBy({ - selected: true - }); - + const { studies } = this.props; // TODO[react]: // - Add sorting of display sets @@ -152,7 +151,7 @@ class FlexboxLayout extends Component {
- {/* TODO: Needs to be moved from Meteor package to react-viewerbase: */} +
{/*{{> measurementLightTable (clone this)}}*/} diff --git a/OHIFViewer-react/src/index.js b/OHIFViewer-react/src/index.js index bb5c5544c..817064250 100644 --- a/OHIFViewer-react/src/index.js +++ b/OHIFViewer-react/src/index.js @@ -4,11 +4,34 @@ import { BrowserRouter } from 'react-router-dom'; import { Provider } from 'react-redux'; import { createStore } from 'redux'; import App from './App.js'; -import { OHIF } from 'ohif-core'; +import OHIF from 'ohif-core'; import './config'; const store = createStore(OHIF.redux.combinedReducer); +const servers = { + dicomWeb: [ + { + "name": "DCM4CHEE", + "wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado", + "qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs", + "wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs", + "qidoSupportsIncludeField": true, + "imageRendering": "wadors", + "thumbnailRendering": "wadors", + "requestOptions": { + "requestFromBrowser": true, + "logRequests": true, + "logResponses": false, + "logTiming": true, + "auth": "admin:admin" + } + } + ] +}; + +OHIF.utils.addServers(servers, store); + // TODO[react] Use a provider when the whole tree is React window.store = store; diff --git a/OHIFViewer-react/src/lib/StackManager.js b/OHIFViewer-react/src/lib/StackManager.js new file mode 100644 index 000000000..c98c026f7 --- /dev/null +++ b/OHIFViewer-react/src/lib/StackManager.js @@ -0,0 +1,151 @@ +import OHIF from 'ohif-core'; +import { getImageId } from './getImageId'; + +let stackMap = {}; +let configuration = {}; +const stackUpdatedCallbacks = []; + +const { OHIFError } = OHIF.classes; + + +/** + * Loop through the current series and add metadata to the + * Cornerstone meta data provider. This will be used to fill information + * into the viewport overlays, and to calculate reference lines and orientation markers + * @param {Object} stackMap stackMap object + * @param {Object} study Study object + * @param {Object} displaySet The set of images to make the stack from + * @return {Array} Array with image IDs + */ +function createAndAddStack(stackMap, study, displaySet) { + const metadataProvider = OHIF.viewer.metadataProvider; + const numImages = displaySet.images.length; + const imageIds = []; + let imageId; + + displaySet.images.forEach((instance, imageIndex) => { + const image = instance.getData(); + const metaData = { + instance: image, // in this context, instance will be the data of the InstanceMetadata object... + series: displaySet, // TODO: Check this + study, + numImages, + imageIndex: imageIndex + 1 + }; + + const numberOfFrames = image.numberOfFrames; + if (numberOfFrames > 1) { + OHIF.log.info('Multiframe image detected'); + for (let i = 0; i < numberOfFrames; i++) { + metaData.frameNumber = i; + imageId = getImageId(image, i); + imageIds.push(imageId); + metadataProvider.addMetadata(imageId, metaData); + } + } else { + metaData.frameNumber = 1; + imageId = getImageId(image); + imageIds.push(imageId); + metadataProvider.addMetadata(imageId, metaData); + } + }); + + const stack = { + displaySetInstanceUid: displaySet.displaySetInstanceUid, + imageIds, + frameRate: displaySet.frameRate, + isClip: displaySet.isClip + }; + + stackMap[displaySet.displaySetInstanceUid] = stack; + + return stack; +} + +configuration = { + createAndAddStack +}; + +/** + * This object contains all the functions needed for interacting with the stack manager. + * Generally, findStack is the only function used. If you want to know when new stacks + * come in, you can register a callback with addStackUpdatedCallback. + */ +const StackManager = { + /** + * Removes all current stacks + */ + clearStacks() { + stackMap = {}; + }, + /** + * Create a stack from an image set, as well as add in the metadata on a per image bases. + * @param study The study who's metadata will be added + * @param displaySet The set of images to make the stack from + * @return {Array} Array with image IDs + */ + makeAndAddStack(study, displaySet) { + return configuration.createAndAddStack(stackMap, study, displaySet, stackUpdatedCallbacks); + }, + /** + * Find a stack from the currently created stacks. + * @param displaySetInstanceUid The UID of the stack to find. + * @returns {*} undefined if not found, otherwise the stack object is returned. + */ + findStack(displaySetInstanceUid) { + return stackMap[displaySetInstanceUid]; + }, + /** + * Find a stack or reate one if it has not been created yet + * @param study The study who's metadata will be added + * @param displaySet The set of images to make the stack from + * @return {Array} Array with image IDs + */ + findOrCreateStack(study, displaySet) { + let stack = this.findStack(displaySet.displaySetInstanceUid); + + if (!stack || !stack.imageIds) { + stack = this.makeAndAddStack(study, displaySet); + } + + return stack; + }, + /** + * Gets the underlying map of displaySetInstanceUid to stack object. + * WARNING: Do not change this object. It directly affects the manager. + * @returns {{}} map of displaySetInstanceUid -> stack. + */ + getAllStacks() { + return stackMap; + }, + /** + * Adds in a callback to be called on a stack being added / updated. + * @param callback must accept at minimum one argument, + * which is the stack that was added / updated. + */ + addStackUpdatedCallback(callback) { + if (typeof callback !== 'function') { + throw new OHIFError('callback must be provided as a function'); + } + stackUpdatedCallbacks.push(callback); + }, + /** + * Return configuration + */ + getConfiguration() { + return configuration; + }, + /** + * Set configuration, in order to provide compatibility + * with other systems by overriding this functions + * @param {Object} config object with functions to be overrided + * + * For now, only makeAndAddStack can be overrided + */ + setConfiguration(config) { + configuration = config; + } +}; + +export { StackManager }; +export default StackManager; diff --git a/OHIFViewer-react/src/lib/createStacks.js b/OHIFViewer-react/src/lib/createStacks.js new file mode 100644 index 000000000..647c766f9 --- /dev/null +++ b/OHIFViewer-react/src/lib/createStacks.js @@ -0,0 +1,128 @@ +import OHIF from 'ohif-core'; +import { isImage } from './isImage'; + +const { ImageSet } = OHIF.classes; + +const isMultiFrame = instance => { + // NumberOfFrames (0028,0008) + return instance.getRawValue('x00280008') > 1; +}; + +const makeDisplaySet = (series, instances) => { + const instance = instances[0]; + + const imageSet = new ImageSet(instances); + const seriesData = series.getData(); + + // set appropriate attributes to image set... + imageSet.setAttributes({ + displaySetInstanceUid: imageSet.uid, // create a local alias for the imageSet UID + seriesDate: seriesData.seriesDate, + seriesTime: seriesData.seriesTime, + seriesInstanceUid: series.getSeriesInstanceUID(), + seriesNumber: instance.getRawValue('x00200011'), + seriesDescription: instance.getRawValue('x0008103e'), + numImageFrames: instances.length, + frameRate: instance.getRawValue('x00181063'), + modality: instance.getRawValue('x00080060'), + isMultiFrame: isMultiFrame(instance) + }); + + // Sort the images in this series if needed + const shallSort = true//!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder'); + if (shallSort) { + imageSet.sortBy((a, b) => { + // Sort by InstanceNumber (0020,0013) + return (parseInt(a.getRawValue('x00200013', 0)) || 0) - (parseInt(b.getRawValue('x00200013', 0)) || 0); + }); + } + + // Include the first image instance number (after sorted) + imageSet.setAttribute('instanceNumber', imageSet.getImage(0).getRawValue('x00200013')); + + return imageSet; +}; + +const isSingleImageModality = modality => { + return (modality === 'CR' || + modality === 'MG' || + modality === 'DX'); +}; + +/** + * Creates a set of series to be placed in the Study Metadata + * The series that appear in the Study Metadata must represent + * imaging modalities. + * + * Furthermore, for drag/drop functionality, + * it is easiest if the stack objects also contain information about + * which study they are linked to. + * + * @param study The study instance metadata to be used + * @returns {Array} An array of series to be placed in the Study Metadata + */ +const createStacks = study => { + // Define an empty array of display sets + const displaySets = []; + + if (!study || !study.getSeriesCount()) { + return displaySets; + } + + // Loop through the series (SeriesMetadata) + study.forEachSeries(series => { + // If the series has no instances, skip it + if (!series.getInstanceCount()) { + return; + } + + // Search through the instances (InstanceMedatada object) of this series + // Split Multi-frame instances and Single-image modalities + // into their own specific display sets. Place the rest of each + // series into another display set. + const stackableInstances = []; + series.forEachInstance(instance => { + // All imaging modalities must have a valid value for sopClassUid (x00080016) or rows (x00280010) + if (!isImage(instance.getRawValue('x00080016')) && !instance.getRawValue('x00280010')) { + return; + } + + let displaySet; + if (isMultiFrame(instance)) { + displaySet = makeDisplaySet(series, [ instance ]); + displaySet.setAttributes({ + isClip: true, + studyInstanceUid: study.getStudyInstanceUID(), // Include the study instance Uid for drag/drop purposes + numImageFrames: instance.getRawValue('x00280008'), // Override the default value of instances.length + instanceNumber: instance.getRawValue('x00200013'), // Include the instance number + acquisitionDatetime: instance.getRawValue('x0008002a') // Include the acquisition datetime + }); + displaySets.push(displaySet); + } else if (isSingleImageModality(instance.modality)) { + displaySet = makeDisplaySet(series, [ instance ]); + displaySet.setAttributes({ + studyInstanceUid: study.getStudyInstanceUID(), // Include the study instance Uid + instanceNumber: instance.getRawValue('x00200013'), // Include the instance number + acquisitionDatetime: instance.getRawValue('x0008002a') // Include the acquisition datetime + }); + displaySets.push(displaySet); + } else { + stackableInstances.push(instance); + } + }); + + if (stackableInstances.length) { + const displaySet = makeDisplaySet(series, stackableInstances); + displaySet.setAttribute('studyInstanceUid', study.getStudyInstanceUID()); + displaySets.push(displaySet); + } + }); + + return displaySets; +}; + +/** + * Expose "createStacks"... + */ + +export { createStacks }; diff --git a/OHIFViewer-react/src/lib/getImageId.js b/OHIFViewer-react/src/lib/getImageId.js new file mode 100644 index 000000000..1f14d0d20 --- /dev/null +++ b/OHIFViewer-react/src/lib/getImageId.js @@ -0,0 +1,51 @@ +import { getWADORSImageId } from './getWADORSImageId'; + +// https://stackoverflow.com/a/6021027/3895126 +function updateQueryStringParameter(uri, key, value) { + const regex = new RegExp('([?&])' + key + '=.*?(&|$)', 'i'); + const separator = uri.indexOf('?') !== -1 ? '&' : '?'; + if (uri.match(regex)) { + return uri.replace(regex, '$1' + key + '=' + value + '$2'); + } else { + return uri + separator + key + '=' + value; + } +} + +/** + * Obtain an imageId for Cornerstone from an image instance + * + * @param instance + * @param frame + * @param thumbnail + * @returns {string} The imageId to be used by Cornerstone + */ +export function getImageId(instance, frame, thumbnail=false) { + if (!instance) { + return; + } + + if (typeof instance.getImageId === 'function') { + return instance.getImageId(); + } + + if (instance.url) { + if (frame !== undefined) { + instance.url = updateQueryStringParameter(instance.url, 'frame', frame); + } + + return instance.url; + } + + const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering'; + + if (!instance[renderingAttr] || instance[renderingAttr] === 'wadouri' || !instance.wadorsuri) { + let imageId = 'dicomweb:' + instance.wadouri; + if (frame !== undefined) { + imageId += '&frame=' + frame; + } + + return imageId; + } else { + return getWADORSImageId(instance, frame, thumbnail); // WADO-RS Retrieve Frame + } +} diff --git a/OHIFViewer-react/src/lib/getWADORSImageId.js b/OHIFViewer-react/src/lib/getWADORSImageId.js new file mode 100644 index 000000000..c1df420d9 --- /dev/null +++ b/OHIFViewer-react/src/lib/getWADORSImageId.js @@ -0,0 +1,31 @@ +function getWADORSImageUrl(instance, frame) { + let wadorsuri = instance.wadorsuri; + + if (!wadorsuri) { + return; + } + + // We need to sum 1 because WADO-RS frame number is 1-based + frame = (frame || 0) + 1; + + // Replaces /frame/1 by /frame/{frame} + wadorsuri = wadorsuri.replace(/(%2Fframes%2F)(\d+)/, `$1${frame}`); + + return wadorsuri; +} + +/** + * Obtain an imageId for Cornerstone based on the WADO-RS scheme + * + * @param {object} instanceMetada metadata object (InstanceMetadata) + * @returns {string} The imageId to be used by Cornerstone + */ +export function getWADORSImageId(instance, frame) { + const uri = getWADORSImageUrl(instance, frame); + + if (!uri) { + return; + } + + return `wadors:${uri}`; +}; diff --git a/OHIFViewer-react/src/lib/isImage.js b/OHIFViewer-react/src/lib/isImage.js new file mode 100644 index 000000000..f90d26ce5 --- /dev/null +++ b/OHIFViewer-react/src/lib/isImage.js @@ -0,0 +1,61 @@ +import { sopClassDictionary } from './sopClassDictionary'; + +/** + * Checks whether dicom files with specified SOP Class UID have image data + * @param {string} sopClassUid - SOP Class UID to be checked + * @returns {boolean} - true if it has image data + */ +export function isImage(sopClassUid) { + if (sopClassUid === sopClassDictionary.ComputedRadiographyImageStorage + || sopClassUid === sopClassDictionary.DigitalXRayImageStorageForPresentation + || sopClassUid === sopClassDictionary.DigitalXRayImageStorageForProcessing + || sopClassUid === sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation + || sopClassUid === sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing + || sopClassUid === sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation + || sopClassUid === sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing + || sopClassUid === sopClassDictionary.CTImageStorage + || sopClassUid === sopClassDictionary.EnhancedCTImageStorage + || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedCTImageStorage + || sopClassUid === sopClassDictionary.UltrasoundMultiframeImageStorage + || sopClassUid === sopClassDictionary.MRImageStorage + || sopClassUid === sopClassDictionary.EnhancedMRImageStorage + || sopClassUid === sopClassDictionary.EnhancedMRColorImageStorage + || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedMRImageStorage + || sopClassUid === sopClassDictionary.UltrasoundImageStorage + || sopClassUid === sopClassDictionary.SecondaryCaptureImageStorage + || sopClassUid === sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage + || sopClassUid === sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage + || sopClassUid === sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage + || sopClassUid === sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage + || sopClassUid === sopClassDictionary.XRayAngiographicImageStorage + || sopClassUid === sopClassDictionary.EnhancedXAImageStorage + || sopClassUid === sopClassDictionary.XRayRadiofluoroscopicImageStorage + || sopClassUid === sopClassDictionary.EnhancedXRFImageStorage + || sopClassUid === sopClassDictionary.XRay3DAngiographicImageStorage + || sopClassUid === sopClassDictionary.XRay3DCraniofacialImageStorage + || sopClassUid === sopClassDictionary.BreastTomosynthesisImageStorage + || sopClassUid === sopClassDictionary.BreastProjectionXRayImageStorageForPresentation + || sopClassUid === sopClassDictionary.BreastProjectionXRayImageStorageForProcessing + || sopClassUid === sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation + || sopClassUid === sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing + || sopClassUid === sopClassDictionary.NuclearMedicineImageStorage + || sopClassUid === sopClassDictionary.VLEndoscopicImageStorage + || sopClassUid === sopClassDictionary.VideoEndoscopicImageStorage + || sopClassUid === sopClassDictionary.VLMicroscopicImageStorage + || sopClassUid === sopClassDictionary.VideoMicroscopicImageStorage + || sopClassUid === sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage + || sopClassUid === sopClassDictionary.VLPhotographicImageStorage + || sopClassUid === sopClassDictionary.VideoPhotographicImageStorage + || sopClassUid === sopClassDictionary.OphthalmicPhotography8BitImageStorage + || sopClassUid === sopClassDictionary.OphthalmicPhotography16BitImageStorage + || sopClassUid === sopClassDictionary.OphthalmicTomographyImageStorage + || sopClassUid === sopClassDictionary.VLWholeSlideMicroscopyImageStorage + || sopClassUid === sopClassDictionary.PositronEmissionTomographyImageStorage + || sopClassUid === sopClassDictionary.EnhancedPETImageStorage + || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedPETImageStorage + || sopClassUid === sopClassDictionary.RTImageStorage) { + return true; + } + + return false; +} diff --git a/OHIFViewer-react/src/lib/sopClassDictionary.js b/OHIFViewer-react/src/lib/sopClassDictionary.js new file mode 100644 index 000000000..7be21ce3a --- /dev/null +++ b/OHIFViewer-react/src/lib/sopClassDictionary.js @@ -0,0 +1,116 @@ +// TODO: Deprecate since we have the same thing in dcmjs? +export const sopClassDictionary = { + ComputedRadiographyImageStorage: "1.2.840.10008.5.1.4.1.1.1", + DigitalXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.1", + DigitalXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.1.1", + DigitalMammographyXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.2", + DigitalMammographyXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.2.1", + DigitalIntraOralXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.3", + DigitalIntraOralXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.3.1", + CTImageStorage: "1.2.840.10008.5.1.4.1.1.2", + EnhancedCTImageStorage: "1.2.840.10008.5.1.4.1.1.2.1", + LegacyConvertedEnhancedCTImageStorage: "1.2.840.10008.5.1.4.1.1.2.2", + UltrasoundMultiframeImageStorage: "1.2.840.10008.5.1.4.1.1.3.1", + MRImageStorage: "1.2.840.10008.5.1.4.1.1.4", + EnhancedMRImageStorage: "1.2.840.10008.5.1.4.1.1.4.1", + MRSpectroscopyStorage: "1.2.840.10008.5.1.4.1.1.4.2", + EnhancedMRColorImageStorage: "1.2.840.10008.5.1.4.1.1.4.3", + LegacyConvertedEnhancedMRImageStorage: "1.2.840.10008.5.1.4.1.1.4.4", + UltrasoundImageStorage: "1.2.840.10008.5.1.4.1.1.6.1", + EnhancedUSVolumeStorage: "1.2.840.10008.5.1.4.1.1.6.2", + SecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7", + MultiframeSingleBitSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.1", + MultiframeGrayscaleByteSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.2", + MultiframeGrayscaleWordSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.3", + MultiframeTrueColorSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.4", + Sop12LeadECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.1", + GeneralECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.2", + AmbulatoryECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.3", + HemodynamicWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.2.1", + CardiacElectrophysiologyWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.3.1", + BasicVoiceAudioWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.4.1", + GeneralAudioWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.4.2", + ArterialPulseWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.5.1", + RespiratoryWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.6.1", + GrayscaleSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.1", + ColorSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.2", + PseudoColorSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.3", + BlendingSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.4", + XAXRFGrayscaleSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.5", + XRayAngiographicImageStorage: "1.2.840.10008.5.1.4.1.1.12.1", + EnhancedXAImageStorage: "1.2.840.10008.5.1.4.1.1.12.1.1", + XRayRadiofluoroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.12.2", + EnhancedXRFImageStorage: "1.2.840.10008.5.1.4.1.1.12.2.1", + XRay3DAngiographicImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.1", + XRay3DCraniofacialImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.2", + BreastTomosynthesisImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.3", + BreastProjectionXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.13.1.4", + BreastProjectionXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.13.1.5", + IntravascularOpticalCoherenceTomographyImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.14.1", + IntravascularOpticalCoherenceTomographyImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.14.2", + NuclearMedicineImageStorage: "1.2.840.10008.5.1.4.1.1.20", + RawDataStorage: "1.2.840.10008.5.1.4.1.1.66", + SpatialRegistrationStorage: "1.2.840.10008.5.1.4.1.1.66.1", + SpatialFiducialsStorage: "1.2.840.10008.5.1.4.1.1.66.2", + DeformableSpatialRegistrationStorage: "1.2.840.10008.5.1.4.1.1.66.3", + SegmentationStorage: "1.2.840.10008.5.1.4.1.1.66.4", + SurfaceSegmentationStorage: "1.2.840.10008.5.1.4.1.1.66.5", + RealWorldValueMappingStorage: "1.2.840.10008.5.1.4.1.1.67", + SurfaceScanMeshStorage: "1.2.840.10008.5.1.4.1.1.68.1", + SurfaceScanPointCloudStorage: "1.2.840.10008.5.1.4.1.1.68.2", + VLEndoscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.1", + VideoEndoscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.1.1", + VLMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.2", + VideoMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.2.1", + VLSlideCoordinatesMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.3", + VLPhotographicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.4", + VideoPhotographicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.4.1", + OphthalmicPhotography8BitImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.1", + OphthalmicPhotography16BitImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.2", + StereometricRelationshipStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.3", + OphthalmicTomographyImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.4", + VLWholeSlideMicroscopyImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.6", + LensometryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.1", + AutorefractionMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.2", + KeratometryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.3", + SubjectiveRefractionMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.4", + VisualAcuityMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.5", + SpectaclePrescriptionReportStorage: "1.2.840.10008.5.1.4.1.1.78.6", + OphthalmicAxialMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.7", + IntraocularLensCalculationsStorage: "1.2.840.10008.5.1.4.1.1.78.8", + MacularGridThicknessandVolumeReport: "1.2.840.10008.5.1.4.1.1.79.1", + OphthalmicVisualFieldStaticPerimetryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.80.1", + OphthalmicThicknessMapStorage: "1.2.840.10008.5.1.4.1.1.81.1", + CornealTopographyMapStorage: "1.2.840.10008.5.1.4.1.1.82.1", + BasicTextSR: "1.2.840.10008.5.1.4.1.1.88.11", + EnhancedSR: "1.2.840.10008.5.1.4.1.1.88.22", + ComprehensiveSR: "1.2.840.10008.5.1.4.1.1.88.33", + Comprehensive3DSR: "1.2.840.10008.5.1.4.1.1.88.34", + ProcedureLog: "1.2.840.10008.5.1.4.1.1.88.40", + MammographyCADSR: "1.2.840.10008.5.1.4.1.1.88.50", + KeyObjectSelection: "1.2.840.10008.5.1.4.1.1.88.59", + ChestCADSR: "1.2.840.10008.5.1.4.1.1.88.65", + XRayRadiationDoseSR: "1.2.840.10008.5.1.4.1.1.88.67", + RadiopharmaceuticalRadiationDoseSR: "1.2.840.10008.5.1.4.1.1.88.68", + ColonCADSR: "1.2.840.10008.5.1.4.1.1.88.69", + ImplantationPlanSRDocumentStorage: "1.2.840.10008.5.1.4.1.1.88.70", + EncapsulatedPDFStorage: "1.2.840.10008.5.1.4.1.1.104.1", + EncapsulatedCDAStorage: "1.2.840.10008.5.1.4.1.1.104.2", + PositronEmissionTomographyImageStorage: "1.2.840.10008.5.1.4.1.1.128", + EnhancedPETImageStorage: "1.2.840.10008.5.1.4.1.1.130", + LegacyConvertedEnhancedPETImageStorage: "1.2.840.10008.5.1.4.1.1.128.1", + BasicStructuredDisplayStorage: "1.2.840.10008.5.1.4.1.1.131", + RTImageStorage: "1.2.840.10008.5.1.4.1.1.481.1", + RTDoseStorage: "1.2.840.10008.5.1.4.1.1.481.2", + RTStructureSetStorage: "1.2.840.10008.5.1.4.1.1.481.3", + RTBeamsTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.4", + RTPlanStorage: "1.2.840.10008.5.1.4.1.1.481.5", + RTBrachyTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.6", + RTTreatmentSummaryRecordStorage: "1.2.840.10008.5.1.4.1.1.481.7", + RTIonPlanStorage: "1.2.840.10008.5.1.4.1.1.481.8", + RTIonBeamsTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.9", + RTBeamsDeliveryInstructionStorage: "1.2.840.10008.5.1.4.34.7", + GenericImplantTemplateStorage: "1.2.840.10008.5.1.4.43.1", + ImplantAssemblyTemplateStorage: "1.2.840.10008.5.1.4.44.1", + ImplantTemplateGroupStorage: "1.2.840.10008.5.1.4.45.1" +}; diff --git a/OHIFViewer-react/src/lib/sortingManager.js b/OHIFViewer-react/src/lib/sortingManager.js new file mode 100644 index 000000000..b1bd9f3d3 --- /dev/null +++ b/OHIFViewer-react/src/lib/sortingManager.js @@ -0,0 +1,13 @@ +import { createStacks } from './createStacks'; + +const getDisplaySets = (studyMetadata, seriesNumber, iteratorFunction) => { + const iteratorFn = typeof iteratorFunction !== 'function' ? createStacks : iteratorFunction; + + return iteratorFn(studyMetadata, seriesNumber); +}; + +const sortingManager = { + getDisplaySets +}; + +export { sortingManager }; diff --git a/OHIFViewer-react/src/lib/updateMetaDataManager.js b/OHIFViewer-react/src/lib/updateMetaDataManager.js new file mode 100644 index 000000000..0f9f37ece --- /dev/null +++ b/OHIFViewer-react/src/lib/updateMetaDataManager.js @@ -0,0 +1,88 @@ +import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'; +import OHIF from 'ohif-core'; +import { getWADORSImageId } from './getWADORSImageId'; + +function getRadiopharmaceuticalInfoMetaData(instance) { + const radiopharmaceuticalInfo = instance.radiopharmaceuticalInfo; + + if ((instance.modality !== 'PT') || !radiopharmaceuticalInfo) { + return; + } + const { WadoRsMetaDataBuilder } = OHIF.metadata; + + return new WadoRsMetaDataBuilder() + .addTag('00181072', radiopharmaceuticalInfo.radiopharmaceuticalStartTime) + .addTag('00181074', radiopharmaceuticalInfo.radionuclideTotalDose) + .addTag('00181075', radiopharmaceuticalInfo.radionuclideHalfLife) + .toJSON(); +} + +const getWadoRsInstanceMetaData = (study, series, instance) => { + const { WadoRsMetaDataBuilder } = OHIF.metadata; + return new WadoRsMetaDataBuilder() + .addTag('00080016', instance.sopClassUid) + .addTag('00080018', instance.sopInstanceUid) + .addTag('00080021', series.seriesDate) + .addTag('00080031', series.seriesTime) + .addTag('00080060', instance.modality) + .addTag('00101010', study.patientAge) + .addTag('00101020', study.patientSize) + .addTag('00101030', study.patientWeight) + .addTag('00180050', instance.sliceThickness) + .addTag('0020000e', series.seriesInstanceUid) + .addTag('00200011', series.seriesNumber) + .addTag('0020000d', study.studyInstanceUid) + .addTag('00200013', instance.instanceNumber) + .addTag('00200032', instance.imagePositionPatient, true) + .addTag('00200037', instance.imageOrientationPatient, true) + .addTag('00200052', instance.frameOfReferenceUID) + .addTag('00201041', instance.sliceLocation) + .addTag('00280002', instance.samplesPerPixel) + .addTag('00280004', instance.photometricInterpretation) + .addTag('00280006', instance.planarConfiguration) + .addTag('00280010', instance.rows) + .addTag('00280011', instance.columns) + .addTag('00280030', instance.pixelSpacing, true) + .addTag('00280034', instance.pixelAspectRatio, true) + .addTag('00280100', instance.bitsAllocated) + .addTag('00280101', instance.bitsStored) + .addTag('00280102', instance.highBit) + .addTag('00280103', instance.pixelRepresentation) + .addTag('00280106', instance.smallestPixelValue) + .addTag('00280107', instance.largestPixelValue) + .addTag('00281050', instance.windowCenter, true) + .addTag('00281051', instance.windowWidth, true) + .addTag('00281052', instance.rescaleIntercept) + .addTag('00281053', instance.rescaleSlope) + .addTag('00281054', instance.rescaleType) + .addTag('00281101', instance.redPaletteColorLookupTableDescriptor) + .addTag('00281102', instance.greenPaletteColorLookupTableDescriptor) + .addTag('00281103', instance.bluePaletteColorLookupTableDescriptor) + .addTag('00281201', instance.redPaletteColorLookupTableData) + .addTag('00281202', instance.greenPaletteColorLookupTableData) + .addTag('00281203', instance.bluePaletteColorLookupTableData) + .addTag('00540016', getRadiopharmaceuticalInfoMetaData(instance)) + .toJSON(); +}; + +export function updateMetaDataManager(study) { + study.seriesList.forEach(series => { + series.instances.forEach(instance => { + // Cache just images that are going to be loaded via WADO-RS + if ((instance.imageRendering !== 'wadors') && (instance.thumbnailRendering !== 'wadors')) { + return; + } + + const metaData = getWadoRsInstanceMetaData(study, series, instance); + const numberOfFrames = instance.numberOfFrames || 1; + + // We can share the same metaData with all frames because it doesn't have + // any frame specific data, such as frameNumber, pixelData, offset, etc. + // WADO-RS frame number is 1-based + for (let frameNumber = 0; frameNumber < numberOfFrames; frameNumber++) { + const imageId = getWADORSImageId(instance, frameNumber); + cornerstoneWADOImageLoader.wadors.metaDataManager.add(imageId, metaData); + } + }); + }); +} diff --git a/OHIFViewer-react/src/sha.js b/OHIFViewer-react/src/sha.js index 6e0504d74..79b206e73 100644 --- a/OHIFViewer-react/src/sha.js +++ b/OHIFViewer-react/src/sha.js @@ -1 +1 @@ -export default '7b66dec163174eae2f6aca133f740529c8b4d08c'; +export default 'fc5bd73c1ed247b233bfc7ebed1fb00c990f98d5'; diff --git a/OHIFViewer-react/src/viewer/viewer.js b/OHIFViewer-react/src/viewer/viewer.js index 8f16b9717..0e5cc60b6 100644 --- a/OHIFViewer-react/src/viewer/viewer.js +++ b/OHIFViewer-react/src/viewer/viewer.js @@ -2,7 +2,7 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import cornerstone from 'cornerstone-core'; import cornerstoneTools from 'cornerstone-tools'; -import { OHIF } from 'ohif-core'; +import OHIF from 'ohif-core'; import { CineDialog } from 'react-viewerbase'; import FlexboxLayout from '../flexboxLayout/flexboxLayout.js'; @@ -48,7 +48,7 @@ OHIF.viewer.cine = { loop: true }; -const viewportUtils = OHIF.viewerbase.viewportUtils; +/*const viewportUtils = OHIF.viewerbase.viewportUtils; OHIF.viewer.functionList = { toggleCineDialog: viewportUtils.toggleCineDialog, @@ -56,7 +56,7 @@ OHIF.viewer.functionList = { clearTools: viewportUtils.clearTools, resetViewport: viewportUtils.resetViewport, invert: viewportUtils.invert -}; +};*/ // Create the synchronizer used to update reference lines OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('cornerstonenewimage', cornerstoneTools.updateImageSynchronizer); diff --git a/OHIFViewer-react/yarn-error.log b/OHIFViewer-react/yarn-error.log index 0f6126c7d..c426f796a 100644 --- a/OHIFViewer-react/yarn-error.log +++ b/OHIFViewer-react/yarn-error.log @@ -1,5 +1,5 @@ Arguments: - /usr/local/Cellar/node/11.1.0/bin/node /usr/local/Cellar/yarn/1.12.1/libexec/bin/yarn.js add ohif-core + /usr/local/Cellar/node/11.1.0/bin/node /usr/local/Cellar/yarn/1.12.1/libexec/bin/yarn.js install PATH: /usr/local/bin:/usr/local/opt/openldap/sbin:/usr/local/opt/openldap/bin:/Developer/NVIDIA/CUDA-10.0/bin:/Users/Erik/anaconda/bin:/usr/local/opt/llvm/bin/:/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/:/Users/Erik/SourceCode/Orthanc/OrthancBuild/Release:/usr/local/share/python:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/python:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Erik/npm/bin @@ -14,17 +14,7 @@ Platform: darwin x64 Trace: - Error: https://registry.yarnpkg.com/ohif-core: Not found - at Request.params.callback [as _callback] (/usr/local/Cellar/yarn/1.12.1/libexec/lib/cli.js:63139:18) - at Request.self.callback (/usr/local/Cellar/yarn/1.12.1/libexec/lib/cli.js:124547:22) - at Request.emit (events.js:182:13) - at Request. (/usr/local/Cellar/yarn/1.12.1/libexec/lib/cli.js:125519:10) - at Request.emit (events.js:182:13) - at IncomingMessage. (/usr/local/Cellar/yarn/1.12.1/libexec/lib/cli.js:125441:12) - at Object.onceWrapper (events.js:273:13) - at IncomingMessage.emit (events.js:187:15) - at endReadableNT (_stream_readable.js:1094:12) - at process.internalTickCallback (internal/process/next_tick.js:72:19) + Error: ENOENT: no such file or directory, open '/Users/Erik/Library/Caches/Yarn/v3/npm-ohif-core-0.1.0-90ae53cc5876abc07d2399aa9b2123ef1d2296ca/node_modules/ohif-core/.yarn-metadata.json' npm manifest: { @@ -41,12 +31,17 @@ npm manifest: "hammerjs": "^2.0.8", "lodash.debounce": "^4.0.8", "moment": "^2.22.2", + "ohif-core": "git://github.com/OHIF/ohif-core#master", "prop-types": "^15.6.2", "react": "^16.4.1", "react-cornerstone-viewport": "^0.1.1", "react-dom": "^16.4.1", + "react-redux": "^6.0.0", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", "react-scripts": "^2.1.1", - "react-viewerbase": "^0.1.2" + "react-viewerbase": "git://github.com/OHIF/react-viewerbase#master", + "redux": "^4.0.1" }, "scripts": { "copy:webworkers": "cp node_modules/cornerstone-wado-image-loader/dist/*.min.js* public", @@ -905,6 +900,13 @@ Lockfile: dependencies: regenerator-runtime "^0.12.0" + "@babel/runtime@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@^7.1.0", "@babel/template@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" @@ -2320,6 +2322,11 @@ Lockfile: kind-of "^6.0.0" shallow-clone "^1.0.0" + clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3711,7 +3718,7 @@ Lockfile: assign-symbols "^1.0.0" is-extendable "^1.0.1" - extend@~3.0.2: + extend@^3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -4450,6 +4457,17 @@ Lockfile: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + history@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + value-equal "^0.4.0" + warning "^3.0.0" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4464,6 +4482,18 @@ Lockfile: resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== + hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + + hoist-non-react-statics@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" + integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== + dependencies: + react-is "^16.3.2" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4802,7 +4832,7 @@ Lockfile: default-gateway "^2.6.0" ipaddr.js "^1.5.2" - invariant@^2.2.2, invariant@^2.2.4: + invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5192,6 +5222,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isomorphic-base64@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/isomorphic-base64/-/isomorphic-base64-1.0.2.tgz#f426aae82569ba8a4ec5ca73ad21a44ab1ee7803" + integrity sha1-9Caq6CVpuopOxcpzrSGkSrHueAM= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -5598,6 +5633,16 @@ Lockfile: isemail "3.x.x" topo "2.x.x" + jquery.hotkeys@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jquery.hotkeys/-/jquery.hotkeys-0.1.0.tgz#a88f636494fe75de41e4b753a059e5a523b83273" + integrity sha1-qI9jZJT+dd5B5LdToFnlpSO4MnM= + + jquery@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== + js-levenshtein@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" @@ -5933,6 +5978,67 @@ Lockfile: p-locate "^3.0.0" path-exists "^3.0.0" + lodash._basecallback@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz#b7b2bb43dc2160424a21ccf26c57e443772a8e27" + integrity sha1-t7K7Q9whYEJKIczybFfkQ3cqjic= + dependencies: + lodash._baseisequal "^3.0.0" + lodash._bindcallback "^3.0.0" + lodash.isarray "^3.0.0" + lodash.pairs "^3.0.0" + + lodash._baseeach@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz#cf8706572ca144e8d9d75227c990da982f932af3" + integrity sha1-z4cGVyyhROjZ11InyZDamC+TKvM= + dependencies: + lodash.keys "^3.0.0" + + lodash._basefind@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basefind/-/lodash._basefind-3.0.0.tgz#b2bba05cc645f972de2cf925fa2bf63a0f60c8ae" + integrity sha1-srugXMZF+XLeLPkl+iv2Og9gyK4= + + lodash._basefindindex@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz#f083360a1b022418ed81bc899beb312e21e74a4f" + integrity sha1-8IM2ChsCJBjtgbyJm+sxLiHnSk8= + + lodash._baseisequal@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" + integrity sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE= + dependencies: + lodash.isarray "^3.0.0" + lodash.istypedarray "^3.0.0" + lodash.keys "^3.0.0" + + lodash._baseismatch@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz#0728fc48efa11699d3d5f2d73049f2ab13c40fd5" + integrity sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U= + dependencies: + lodash._baseisequal "^3.0.0" + + lodash._basematches@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._basematches/-/lodash._basematches-3.2.0.tgz#f47e03f07ec20784ab0968d0cb6cb597e2101158" + integrity sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg= + dependencies: + lodash._baseismatch "^3.0.0" + lodash.pairs "^3.0.0" + + lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + + lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -5948,11 +6054,107 @@ Lockfile: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.every@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7" + integrity sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc= + + lodash.find@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad" + integrity sha1-BG4xnzrOkSrGySRsf2g8XsB7Nq0= + dependencies: + lodash._basecallback "^3.0.0" + lodash._baseeach "^3.0.0" + lodash._basefind "^3.0.0" + lodash._basefindindex "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + + lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + + lodash.findwhere@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.findwhere/-/lodash.findwhere-3.1.0.tgz#7937d34f3eac818dec7fa94e8ca5e26fdba1cfc1" + integrity sha1-eTfTTz6sgY3sf6lOjKXib9uhz8E= + dependencies: + lodash._basematches "^3.0.0" + lodash.find "^3.0.0" + + lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + + lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + + lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + + lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + + lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + + lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + + lodash.istypedarray@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" + integrity sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I= + + lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.merge@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + + lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + + lodash.pairs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9" + integrity sha1-u+CNV4bu6qCaFckevw3LfSvjJqk= + dependencies: + lodash.keys "^3.0.0" + + lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -5978,11 +6180,21 @@ Lockfile: dependencies: lodash._reinterpolate "~3.0.0" + lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + lodash.without@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + "lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -5993,7 +6205,7 @@ Lockfile: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6130,6 +6342,14 @@ Lockfile: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + message-box@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/message-box/-/message-box-0.2.0.tgz#f93da217cb11f2a13cb501846fa713f21d6eabb7" + integrity sha512-SPLfVDEM2YcAgV2IB0B5vOGjvqXSSw7ZibEeXcff8HYpxyG1Uj+XjgnGUGyR1C0EQCvPI3MBx3p7opt2CIQ2hw== + dependencies: + lodash.merge "^4.6.0" + lodash.template "^4.4.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -6329,6 +6549,16 @@ Lockfile: resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== + mongo-object@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mongo-object/-/mongo-object-0.1.3.tgz#56b2a46d3ae4f0bdb1935241928fb444034b92e5" + integrity sha512-m3vs+a1JkvRXELJMe2ieMmBe03NUy6bctGjWicRhReYj8brDi0ojKHLKLmXWr/RupNaFP8Q7/x8xG8GpFtp9wg== + dependencies: + lodash.foreach "^4.5.0" + lodash.isempty "^4.4.0" + lodash.isobject "^3.0.2" + lodash.without "^4.4.0" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6670,6 +6900,18 @@ Lockfile: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + "ohif-core@git://github.com/OHIF/ohif-core#master": + version "0.1.0" + resolved "git://github.com/OHIF/ohif-core#130e621cf3c13817c1c120f91f0e9378b3eba993" + dependencies: + cornerstone-math "^0.1.7" + isomorphic-base64 "^1.0.2" + jquery "^3.3.1" + jquery.hotkeys "^0.1.0" + redux "^4.0.1" + simpl-schema "^1.5.3" + underscore "^1.9.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6966,6 +7208,13 @@ Lockfile: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7766,7 +8015,7 @@ Lockfile: kleur "^2.0.1" sisteransi "^0.1.1" - prop-types@^15.6.2: + prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -8001,6 +8250,48 @@ Lockfile: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.0.tgz#c516995a5652e7bfbed8b497910d5280df74a7e8" integrity sha512-akMy/BQT5m1J3iJIHkSb4qycq2wzllWsmmolaaFVnb+LPV9cIJ/nTud40ZsiiT0H3P+/wXIdbjx2fzF61OaeOQ== + react-is@^16.3.2, react-is@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" + integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== + + react-redux@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz#09e86eeed5febb98e9442458ad2970c8f1a173ef" + integrity sha512-EmbC3uLl60pw2VqSSkj6HpZ6jTk12RMrwXMBdYtM6niq0MdEaRq9KYCwpJflkOZj349BLGQm1MI/JO1W96kLWQ== + dependencies: + "@babel/runtime" "^7.2.0" + hoist-non-react-statics "^3.2.1" + invariant "^2.2.4" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-is "^16.6.3" + + react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== + dependencies: + history "^4.7.2" + invariant "^2.2.4" + loose-envify "^1.3.1" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" + + react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + react-scripts@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-2.1.1.tgz#c2959a756b0b61d3090adece0d7aedd324dff8a5" @@ -8056,10 +8347,9 @@ Lockfile: optionalDependencies: fsevents "1.2.4" - react-viewerbase@^0.1.2: + "react-viewerbase@git://github.com/OHIF/react-viewerbase#master": version "0.1.2" - resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.1.2.tgz#3af6e31f72183b0cef4b9c36a3534234039e7b8f" - integrity sha512-ibhnYNe6eVavzZGPN9s/gzRJ7cnkYz8nGMesjH6nigVDdkYgQTCnHzC1laJRFQBgeoNlsd9uKPyvOwjD9ftVuA== + resolved "git://github.com/OHIF/react-viewerbase#851631857f037f8db32534a1d2a74dfa945429e4" dependencies: classnames "^2.2.6" @@ -8153,6 +8443,14 @@ Lockfile: dependencies: minimatch "3.0.4" + redux@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" @@ -8380,6 +8678,11 @@ Lockfile: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8706,6 +9009,26 @@ Lockfile: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + simpl-schema@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/simpl-schema/-/simpl-schema-1.5.3.tgz#c1d12ebddd7ff6dd32ace5e6364824ae506d4a9a" + integrity sha512-J24gSh39gBc3TYRFgaWx81bRf9unNML9u3dTAgxL1KI3F9JOv+Z29yEbosJFqmHfuuZ3K7ET/tTQKX4r4+f8/w== + dependencies: + clone "^2.1.1" + extend "^3.0.1" + lodash.every "^4.6.0" + lodash.find "^4.6.0" + lodash.findwhere "^3.1.0" + lodash.includes "^4.3.0" + lodash.isempty "^4.4.0" + lodash.isobject "^3.0.2" + lodash.omit "^4.5.0" + lodash.pick "^4.4.0" + lodash.union "^4.6.0" + lodash.uniq "^4.5.0" + message-box "^0.2.0" + mongo-object "^0.1.3" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -9162,6 +9485,11 @@ Lockfile: unquote "~1.1.1" util.promisify "~1.0.0" + symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -9435,6 +9763,11 @@ Lockfile: webpack-sources "^1.1.0" worker-farm "^1.5.2" + underscore@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -9617,6 +9950,11 @@ Lockfile: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" + value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9666,6 +10004,20 @@ Lockfile: dependencies: makeerror "1.0.x" + warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + + warning@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + integrity sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug== + dependencies: + loose-envify "^1.0.0" + watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" diff --git a/OHIFViewer-react/yarn.lock b/OHIFViewer-react/yarn.lock index cc4ef6326..c4fbf3ef2 100644 --- a/OHIFViewer-react/yarn.lock +++ b/OHIFViewer-react/yarn.lock @@ -832,6 +832,13 @@ dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@^7.1.0", "@babel/template@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" @@ -2247,6 +2254,11 @@ clone-deep@^2.0.1: kind-of "^6.0.0" shallow-clone "^1.0.0" +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3638,7 +3650,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@^3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -4377,6 +4389,17 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +history@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + value-equal "^0.4.0" + warning "^3.0.0" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4391,6 +4414,18 @@ hoek@4.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== +hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" + integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== + dependencies: + react-is "^16.3.2" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4729,7 +4764,7 @@ internal-ip@^3.0.1: default-gateway "^2.6.0" ipaddr.js "^1.5.2" -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5875,6 +5910,67 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash._basecallback@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz#b7b2bb43dc2160424a21ccf26c57e443772a8e27" + integrity sha1-t7K7Q9whYEJKIczybFfkQ3cqjic= + dependencies: + lodash._baseisequal "^3.0.0" + lodash._bindcallback "^3.0.0" + lodash.isarray "^3.0.0" + lodash.pairs "^3.0.0" + +lodash._baseeach@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz#cf8706572ca144e8d9d75227c990da982f932af3" + integrity sha1-z4cGVyyhROjZ11InyZDamC+TKvM= + dependencies: + lodash.keys "^3.0.0" + +lodash._basefind@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basefind/-/lodash._basefind-3.0.0.tgz#b2bba05cc645f972de2cf925fa2bf63a0f60c8ae" + integrity sha1-srugXMZF+XLeLPkl+iv2Og9gyK4= + +lodash._basefindindex@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz#f083360a1b022418ed81bc899beb312e21e74a4f" + integrity sha1-8IM2ChsCJBjtgbyJm+sxLiHnSk8= + +lodash._baseisequal@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" + integrity sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE= + dependencies: + lodash.isarray "^3.0.0" + lodash.istypedarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseismatch@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz#0728fc48efa11699d3d5f2d73049f2ab13c40fd5" + integrity sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U= + dependencies: + lodash._baseisequal "^3.0.0" + +lodash._basematches@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._basematches/-/lodash._basematches-3.2.0.tgz#f47e03f07ec20784ab0968d0cb6cb597e2101158" + integrity sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg= + dependencies: + lodash._baseismatch "^3.0.0" + lodash.pairs "^3.0.0" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -5890,11 +5986,107 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.every@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7" + integrity sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc= + +lodash.find@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad" + integrity sha1-BG4xnzrOkSrGySRsf2g8XsB7Nq0= + dependencies: + lodash._basecallback "^3.0.0" + lodash._baseeach "^3.0.0" + lodash._basefind "^3.0.0" + lodash._basefindindex "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + +lodash.findwhere@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.findwhere/-/lodash.findwhere-3.1.0.tgz#7937d34f3eac818dec7fa94e8ca5e26fdba1cfc1" + integrity sha1-eTfTTz6sgY3sf6lOjKXib9uhz8E= + dependencies: + lodash._basematches "^3.0.0" + lodash.find "^3.0.0" + +lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.istypedarray@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" + integrity sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + +lodash.pairs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9" + integrity sha1-u+CNV4bu6qCaFckevw3LfSvjJqk= + dependencies: + lodash.keys "^3.0.0" + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -5920,11 +6112,21 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.without@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + "lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -5935,7 +6137,7 @@ loglevel@^1.4.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6072,6 +6274,14 @@ merge@^1.2.0: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== +message-box@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/message-box/-/message-box-0.2.0.tgz#f93da217cb11f2a13cb501846fa713f21d6eabb7" + integrity sha512-SPLfVDEM2YcAgV2IB0B5vOGjvqXSSw7ZibEeXcff8HYpxyG1Uj+XjgnGUGyR1C0EQCvPI3MBx3p7opt2CIQ2hw== + dependencies: + lodash.merge "^4.6.0" + lodash.template "^4.4.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -6271,6 +6481,16 @@ moment@^2.23.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== +mongo-object@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mongo-object/-/mongo-object-0.1.3.tgz#56b2a46d3ae4f0bdb1935241928fb444034b92e5" + integrity sha512-m3vs+a1JkvRXELJMe2ieMmBe03NUy6bctGjWicRhReYj8brDi0ojKHLKLmXWr/RupNaFP8Q7/x8xG8GpFtp9wg== + dependencies: + lodash.foreach "^4.5.0" + lodash.isempty "^4.4.0" + lodash.isobject "^3.0.2" + lodash.without "^4.4.0" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6612,9 +6832,17 @@ obuf@^1.0.0, obuf@^1.1.1: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -"ohif-core@link:../../ohif-core": - version "0.0.0" - uid "" +"ohif-core@git://github.com/OHIF/ohif-core#master": + version "0.1.0" + resolved "git://github.com/OHIF/ohif-core#130e621cf3c13817c1c120f91f0e9378b3eba993" + dependencies: + cornerstone-math "^0.1.7" + isomorphic-base64 "^1.0.2" + jquery "^3.3.1" + jquery.hotkeys "^0.1.0" + redux "^4.0.1" + simpl-schema "^1.5.3" + underscore "^1.9.1" on-finished@~2.3.0: version "2.3.0" @@ -6912,6 +7140,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7712,7 +7947,7 @@ prompts@^0.1.9: kleur "^2.0.1" sisteransi "^0.1.1" -prop-types@^15.6.2: +prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -7947,6 +8182,48 @@ react-error-overlay@^5.1.0: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.0.tgz#c516995a5652e7bfbed8b497910d5280df74a7e8" integrity sha512-akMy/BQT5m1J3iJIHkSb4qycq2wzllWsmmolaaFVnb+LPV9cIJ/nTud40ZsiiT0H3P+/wXIdbjx2fzF61OaeOQ== +react-is@^16.3.2, react-is@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" + integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== + +react-redux@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz#09e86eeed5febb98e9442458ad2970c8f1a173ef" + integrity sha512-EmbC3uLl60pw2VqSSkj6HpZ6jTk12RMrwXMBdYtM6niq0MdEaRq9KYCwpJflkOZj349BLGQm1MI/JO1W96kLWQ== + dependencies: + "@babel/runtime" "^7.2.0" + hoist-non-react-statics "^3.2.1" + invariant "^2.2.4" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-is "^16.6.3" + +react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== + dependencies: + history "^4.7.2" + invariant "^2.2.4" + loose-envify "^1.3.1" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" + +react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + react-scripts@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-2.1.1.tgz#c2959a756b0b61d3090adece0d7aedd324dff8a5" @@ -8002,10 +8279,9 @@ react-scripts@^2.1.1: optionalDependencies: fsevents "1.2.4" -react-viewerbase@^0.1.2: +"react-viewerbase@git://github.com/OHIF/react-viewerbase#master": version "0.1.2" - resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.1.2.tgz#3af6e31f72183b0cef4b9c36a3534234039e7b8f" - integrity sha512-ibhnYNe6eVavzZGPN9s/gzRJ7cnkYz8nGMesjH6nigVDdkYgQTCnHzC1laJRFQBgeoNlsd9uKPyvOwjD9ftVuA== + resolved "git://github.com/OHIF/react-viewerbase#851631857f037f8db32534a1d2a74dfa945429e4" dependencies: classnames "^2.2.6" @@ -8334,6 +8610,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8660,6 +8941,26 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simpl-schema@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/simpl-schema/-/simpl-schema-1.5.3.tgz#c1d12ebddd7ff6dd32ace5e6364824ae506d4a9a" + integrity sha512-J24gSh39gBc3TYRFgaWx81bRf9unNML9u3dTAgxL1KI3F9JOv+Z29yEbosJFqmHfuuZ3K7ET/tTQKX4r4+f8/w== + dependencies: + clone "^2.1.1" + extend "^3.0.1" + lodash.every "^4.6.0" + lodash.find "^4.6.0" + lodash.findwhere "^3.1.0" + lodash.includes "^4.3.0" + lodash.isempty "^4.4.0" + lodash.isobject "^3.0.2" + lodash.omit "^4.5.0" + lodash.pick "^4.4.0" + lodash.union "^4.6.0" + lodash.uniq "^4.5.0" + message-box "^0.2.0" + mongo-object "^0.1.3" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -9581,6 +9882,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9630,6 +9936,20 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + integrity sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug== + dependencies: + loose-envify "^1.0.0" + watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"