Compare commits

..
Author SHA1 Message Date
ohif-bot 3f7eb8a5d3 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.2.14
 - @ohif/core@2.3.8
 - @ohif/viewer@3.4.14
2020-02-06 02:56:29 +00:00
Gustavo André LelisandDanny Brown 7b2d44f2c1 fix: Remove trash data from redux storage after updates (#1358)
* Remove tash data from redux storage after updates

* Imprelemnted more unit tests

* Remove missing comment

Co-authored-by: Danny Brown <danny.ri.brown@gmail.com>
2020-02-05 21:54:57 -05:00
ohif-bot 225da81135 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.2.13
 - @ohif/core@2.3.7
 - @ohif/viewer@3.4.13
2020-01-30 18:33:22 +00:00
Rodrigo AntinarelliandDanny Brown 686d12da5c fix: Set VTK viewport as active by interaction (#1139)
* fix: Set VTK viewport as active by interaction

* feat: listen for vtkscrollevent in wrapper component

* fix: definitions can skip empty storeContexts key

* hoc to set/pass in commandsManager

* Bump minimum react-vtkjs-viewport version to leverage new event

* Simplify to use onScroll event instead of passing down commandsManager to base component

* fix: make sure we include @JamesAPetts bug fix

Co-authored-by: Danny Brown <danny.ri.brown@gmail.com>
2020-01-30 13:26:06 -05:00
17 changed files with 507 additions and 63 deletions

No files matched your search

+19
View File
@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.14](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.2.13...@ohif/extension-vtk@1.2.14) (2020-02-06)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.2.13](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.2.12...@ohif/extension-vtk@1.2.13) (2020-01-30)
### Bug Fixes
* Set VTK viewport as active by interaction ([#1139](https://github.com/OHIF/Viewers/issues/1139)) ([686d12d](https://github.com/OHIF/Viewers/commit/686d12da5c9d3d435b1e326c2a5caee36e2ed27c))
## [1.2.12](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.2.11...@ohif/extension-vtk@1.2.12) (2020-01-30)
**Note:** Version bump only for package @ohif/extension-vtk
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-vtk",
"version": "1.2.12",
"version": "1.2.14",
"description": "OHIF extension for VTK.js",
"author": "OHIF",
"license": "MIT",
@@ -49,10 +49,10 @@
"dependencies": {
"@babel/runtime": "^7.5.5",
"lodash.throttle": "^4.1.1",
"react-vtkjs-viewport": "^0.3.9"
"react-vtkjs-viewport": "^0.8.3"
},
"devDependencies": {
"@ohif/core": "^2.3.6",
"@ohif/core": "^2.3.8",
"@ohif/ui": "^1.1.9",
"cornerstone-tools": "^4.12.0",
"cornerstone-wado-image-loader": "^3.0.0",
+3 -2
View File
@@ -1,6 +1,6 @@
import OHIF from '@ohif/core';
import { View2D } from 'react-vtkjs-viewport';
import { connect } from 'react-redux';
import VTKViewport from './VTKViewport';
const { setViewportActive, setViewportSpecificData } = OHIF.redux.actions;
@@ -18,6 +18,7 @@ const mapStateToProps = (state, ownProps) => {
const pluginDetails = viewportLayout.vtk || {};
return {
activeViewportIndex: state.viewports.activeViewportIndex,
layout: state.viewports.layout,
isActive,
...pluginDetails,
@@ -75,6 +76,6 @@ const ConnectedVTKViewport = connect(
mapStateToProps,
mapDispatchToProps,
mergeProps
)(View2D);
)(VTKViewport);
export default ConnectedVTKViewport;
+6
View File
@@ -77,6 +77,11 @@ class OHIFVTKViewport extends Component {
}),
viewportIndex: PropTypes.number,
children: PropTypes.node,
onScroll: PropTypes.func,
};
static defaultProps = {
onScroll: () => {},
};
static id = 'OHIFVTKViewport';
@@ -386,6 +391,7 @@ class OHIFVTKViewport extends Component {
this.state.paintFilterBackgroundImageData
}
viewportIndex={this.props.viewportIndex}
onScroll={this.props.onScroll}
/>
)}
</div>
+3
View File
@@ -0,0 +1,3 @@
.vtk-viewport-handler svg {
pointer-events: none;
}
+58
View File
@@ -0,0 +1,58 @@
import React, { useEffect, useCallback } from 'react';
import { View2D } from 'react-vtkjs-viewport';
import PropTypes from 'prop-types';
import './VTKViewport.css';
const VTKViewport = props => {
const style = { width: '100%', height: '100%', position: 'relative' };
const setViewportActiveHandler = useCallback(() => {
const { setViewportActive, viewportIndex, activeViewportIndex } = props;
if (viewportIndex !== activeViewportIndex) {
// set in Connected
setViewportActive();
}
});
useEffect(() => {
const handleScrollEvent = evt => {
const vtkViewportApiReference = props.onScroll(props.viewportIndex) || {};
const viewportUid = vtkViewportApiReference.uid;
const viewportWasScrolled = viewportUid === evt.detail.uid;
if (viewportWasScrolled) {
setViewportActiveHandler();
}
};
window.addEventListener('vtkscrollevent', handleScrollEvent);
return () =>
window.removeEventListener('vtkscrollevent', handleScrollEvent);
}, [props, props.onScroll, props.viewportIndex, setViewportActiveHandler]);
return (
<div
className="vtk-viewport-handler"
style={style}
onClick={setViewportActiveHandler}
>
<View2D {...props} />
</div>
);
};
VTKViewport.propTypes = {
setViewportActive: PropTypes.func.isRequired,
viewportIndex: PropTypes.number.isRequired,
activeViewportIndex: PropTypes.number.isRequired,
/* Receives viewportIndex */
onScroll: PropTypes.func,
};
VTKViewport.defaultProps = {
onScroll: () => {},
};
export default VTKViewport;
+9 -11
View File
@@ -103,6 +103,9 @@ const commandsModule = ({ commandsManager }) => {
}
const actions = {
getVtkApis: ({ index }) => {
return apis[index];
},
axial: async ({ viewports }) => {
const api = await _getActiveViewportVTKApi(viewports);
@@ -266,11 +269,12 @@ const commandsModule = ({ commandsManager }) => {
'crosshairsWidget'
);
const uid = api.uid;
const istyle = vtkInteractorStyleMPRCrosshairs.newInstance();
api.setInteractorStyle({
istyle,
configuration: { apis, apiIndex },
configuration: { apis, apiIndex, uid },
});
});
},
@@ -296,55 +300,45 @@ const commandsModule = ({ commandsManager }) => {
},
enableRotateTool: {
commandFn: actions.enableRotateTool,
storeContexts: [],
options: {},
},
enableCrosshairsTool: {
commandFn: actions.enableCrosshairsTool,
storeContexts: [],
options: {},
},
enableLevelTool: {
commandFn: actions.enableLevelTool,
storeContexts: [],
options: {},
},
setBlendModeToComposite: {
commandFn: actions.setBlendModeToComposite,
storeContexts: [],
options: { blendMode: BlendMode.COMPOSITE_BLEND },
},
setBlendModeToMaximumIntensity: {
commandFn: actions.setBlendModeToMaximumIntensity,
storeContexts: [],
options: { blendMode: BlendMode.MAXIMUM_INTENSITY_BLEND },
},
setBlendModeToMinimumIntensity: {
commandFn: actions.setBlendMode,
storeContexts: [],
options: { blendMode: BlendMode.MINIMUM_INTENSITY_BLEND },
},
setBlendModeToAverageIntensity: {
commandFn: actions.setBlendMode,
storeContexts: [],
options: { blendMode: BlendMode.AVERAGE_INTENSITY_BLEND },
},
setSlabThickness: {
// TODO: How do we pass in a function argument?
commandFn: actions.setSlabThickness,
storeContexts: [],
options: {},
},
increaseSlabThickness: {
commandFn: actions.changeSlabThickness,
storeContexts: [],
options: {
change: 3,
},
},
decreaseSlabThickness: {
commandFn: actions.changeSlabThickness,
storeContexts: [],
options: {
change: -3,
},
@@ -355,6 +349,10 @@ const commandsModule = ({ commandsManager }) => {
options: {},
context: 'VIEWER',
},
getVtkApiForViewportIndex: {
commandFn: actions.getVtkApis,
context: 'VIEWER',
},
};
return {
+3 -2
View File
@@ -1,6 +1,7 @@
import asyncComponent from './asyncComponent.js';
import commandsModule from './commandsModule.js';
import toolbarModule from './toolbarModule.js';
import withCommandsManager from './withCommandsManager.js';
// This feels weird
// import loadLocales from './loadLocales';
@@ -14,8 +15,8 @@ const vtkExtension = {
*/
id: 'vtk',
getViewportModule() {
return OHIFVTKViewport;
getViewportModule({ commandsManager }) {
return withCommandsManager(OHIFVTKViewport, commandsManager);
},
getToolbarModule() {
return toolbarModule;
+18
View File
@@ -0,0 +1,18 @@
import React from 'react';
export default function withCommandsManager(Component, commandsManager = {}) {
return class WithCommandsManager extends React.Component {
render() {
return (
<Component
{...this.props}
onScroll={viewportIndex =>
commandsManager.runCommand('getVtkApiForViewportIndex', {
index: viewportIndex,
})
}
/>
);
}
};
}
+22
View File
@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.3.8](https://github.com/OHIF/Viewers/compare/@ohif/core@2.3.7...@ohif/core@2.3.8) (2020-02-06)
### Bug Fixes
* Remove trash data from redux storage after updates ([#1358](https://github.com/OHIF/Viewers/issues/1358)) ([7b2d44f](https://github.com/OHIF/Viewers/commit/7b2d44f2c18241ea521b8d3652aee32e36eaddb8))
## [2.3.7](https://github.com/OHIF/Viewers/compare/@ohif/core@2.3.6...@ohif/core@2.3.7) (2020-01-30)
### Bug Fixes
* Set VTK viewport as active by interaction ([#1139](https://github.com/OHIF/Viewers/issues/1139)) ([686d12d](https://github.com/OHIF/Viewers/commit/686d12da5c9d3d435b1e326c2a5caee36e2ed27c))
## [2.3.6](https://github.com/OHIF/Viewers/compare/@ohif/core@2.3.5...@ohif/core@2.3.6) (2020-01-28)
**Note:** Version bump only for package @ohif/core
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/core",
"version": "2.3.6",
"version": "2.3.8",
"description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team",
"license": "MIT",
+1 -1
View File
@@ -161,7 +161,7 @@ export class CommandsManager {
return;
}
const { commandFn, storeContexts } = definition;
const { commandFn, storeContexts = [] } = definition;
const definitionOptions = definition.options;
let commandParams = {};
+83 -8
View File
@@ -11,20 +11,63 @@ import {
SET_VIEWPORT_LAYOUT_AND_DATA,
} from './../constants/ActionTypes.js';
const DEFAULT_STATE = {
export const DEFAULT_STATE = {
numRows: 1,
numColumns: 1,
activeViewportIndex: 0,
layout: {
viewports: [
{
// plugin: 'cornerstone',
},
],
viewports: [{}],
},
viewportSpecificData: {},
};
/**
* Take the new number of rows and columns, delete all not used viewport data and also set
* active viewport as default in case current one is not available anymore.
*
* @param {Number} numRows
* @param {Number} numColumns
* @param {Object} currentViewportSpecificData
* @returns
*/
const findActiveViewportSpecificData = (
numRows,
numColumns,
currentViewportSpecificData = {}
) => {
const numberOfViewports = numRows * numColumns;
const viewportSpecificData = cloneDeep(currentViewportSpecificData);
if (numberOfViewports < Object.keys(viewportSpecificData).length) {
Object.keys(viewportSpecificData).forEach(key => {
if (key > numberOfViewports - 1) {
delete viewportSpecificData[key];
}
});
}
return viewportSpecificData;
};
/**
* Take new number of rows and columns and make sure the current active viewport index is still available, if not, return the default
*
* @param {Number} numRows
* @param {Number} numColumns
* @param {Number} currentActiveViewportIndex
* @returns
*/
const getActiveViewportIndex = (
numRows,
numColumns,
currentActiveViewportIndex
) => {
const numberOfViewports = numRows * numColumns;
return currentActiveViewportIndex > numberOfViewports - 1
? DEFAULT_STATE.activeViewportIndex
: currentActiveViewportIndex;
};
/**
* The definition of a viewport action.
*
@@ -50,7 +93,12 @@ const viewports = (state = DEFAULT_STATE, action) => {
* @return {Object} New state.
*/
case SET_VIEWPORT_ACTIVE: {
return { ...state, activeViewportIndex: action.viewportIndex };
const activeViewportIndex = getActiveViewportIndex(
state.numRows,
state.numColumns,
action.viewportIndex
);
return { ...state, activeViewportIndex };
}
/**
@@ -59,11 +107,25 @@ const viewports = (state = DEFAULT_STATE, action) => {
* @return {Object} New state.
*/
case SET_VIEWPORT_LAYOUT: {
const { numRows, numColumns } = action;
const viewportSpecificData = findActiveViewportSpecificData(
numRows,
numColumns,
state.viewportSpecificData
);
const activeViewportIndex = getActiveViewportIndex(
numRows,
numColumns,
state.activeViewportIndex
);
return {
...state,
numRows: action.numRows,
numColumns: action.numColumns,
layout: { viewports: [...action.viewports] },
viewportSpecificData,
activeViewportIndex,
};
}
@@ -73,12 +135,25 @@ const viewports = (state = DEFAULT_STATE, action) => {
* @return {Object} New state.
*/
case SET_VIEWPORT_LAYOUT_AND_DATA: {
const { numRows, numColumns } = action;
const viewportSpecificData = findActiveViewportSpecificData(
numRows,
numColumns,
action.viewportSpecificData
);
const activeViewportIndex = getActiveViewportIndex(
numRows,
numColumns,
state.activeViewportIndex
);
return {
...state,
numRows: action.numRows,
numColumns: action.numColumns,
layout: { viewports: [...action.viewports] },
viewportSpecificData: cloneDeep(action.viewportSpecificData),
viewportSpecificData,
activeViewportIndex,
};
}
@@ -1,35 +1,61 @@
// https://medium.com/@netxm/testing-redux-reducers-with-jest-6653abbfe3e1
import reducer from './viewports.js';
import { Reducer } from 'redux-testkit';
import reducer, { DEFAULT_STATE } from './viewports.js';
import * as types from './../constants/ActionTypes.js';
describe('viewports reducer', () => {
it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual({
activeViewportIndex: 0,
numRows: 1,
numColumns: 1,
layout: {
viewports: [{}],
},
viewportSpecificData: {},
});
expect(reducer(undefined, {})).toEqual(DEFAULT_STATE);
});
it('should handle SET_VIEWPORT_ACTIVE', () => {
const setViewportActiveAction = {
it('should handle SET_VIEWPORT_ACTIVE with inexistent viewport index', () => {
const initialState = {
numRows: 4,
numColumns: 4,
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT_ACTIVE,
viewportIndex: 100,
};
const updatedState = reducer({}, setViewportActiveAction);
const expectedToChangeInState = {
activeViewportIndex: 0,
};
expect(updatedState.activeViewportIndex).toEqual(
setViewportActiveAction.viewportIndex
);
Reducer(reducer)
.withState(initialState)
.expect(action)
.toChangeInState(expectedToChangeInState);
});
it('should handle SET_VIEWPORT_ACTIVE with existent viewport index', () => {
const initialState = {
numRows: 4,
numColumns: 4,
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT_ACTIVE,
viewportIndex: 5,
};
const expectedToChangeInState = {
activeViewportIndex: 5,
};
Reducer(reducer)
.withState(initialState)
.expect(action)
.toChangeInState(expectedToChangeInState);
});
it('should handle SET_VIEWPORT_LAYOUT', () => {
const setViewportLayoutAction = {
const initialState = DEFAULT_STATE;
const action = {
type: types.SET_VIEWPORT_LAYOUT,
numRows: 1,
numColumns: 2,
@@ -43,18 +69,193 @@ describe('viewports reducer', () => {
],
};
const updatedState = reducer({}, setViewportLayoutAction);
const expectedToChangeInState = {
numRows: 1,
numColumns: 2,
layout: {
viewports: [
{
plugin: 'cornerstone',
},
{
plugin: 'vtk',
},
],
},
};
expect(updatedState.numRows).toEqual(setViewportLayoutAction.numRows);
expect(updatedState.numColumns).toEqual(setViewportLayoutAction.numColumns);
expect(updatedState.layout.viewports).toEqual(
setViewportLayoutAction.viewports
);
Reducer(reducer)
.withState(initialState)
.expect(action)
.toChangeInState(expectedToChangeInState);
});
it('should handle SET_VIEWPORT_LAYOUT when we reduce the number of viewports', () => {
const initialState = {
numRows: 1,
numColumns: 2,
viewportSpecificData: {
0: { viewportData0: 'viewportData0' },
1: { viewportData1: 'viewportData1' },
},
layout: {
viewports: [],
},
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT_LAYOUT,
numRows: 1,
numColumns: 1,
viewports: [],
};
const expectedState = {
numRows: 1,
numColumns: 1,
viewportSpecificData: {
0: { viewportData0: 'viewportData0' },
},
layout: {
viewports: [],
},
activeViewportIndex: 0,
};
Reducer(reducer)
.withState(initialState)
.expect(action)
.toReturnState(expectedState);
});
it('should handle SET_VIEWPORT_LAYOUT_AND_DATA', () => {
const initialState = {
numRows: 1,
numColumns: 1,
viewportSpecificData: {
0: { viewportData0: 'data0' },
},
layout: {
viewports: [{ plugin: 'cornerstone' }],
},
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT_LAYOUT_AND_DATA,
numRows: 1,
numColumns: 2,
viewports: [{ plugin: 'cornerstone' }, { plugin: 'cornerstone' }],
viewportSpecificData: {
0: { viewportData0: 'NEWdata0' },
1: { viewportData1: 'NEWdata1' },
},
};
const expectedState = {
numRows: 1,
numColumns: 2,
viewportSpecificData: {
0: { viewportData0: 'NEWdata0' },
1: { viewportData1: 'NEWdata1' },
},
layout: {
viewports: [{ plugin: 'cornerstone' }, { plugin: 'cornerstone' }],
},
activeViewportIndex: 0,
};
Reducer(reducer)
.withState(initialState)
.expect(action)
.toReturnState(expectedState);
});
it('should handle SET_VIEWPORT_LAYOUT_AND_DATA when we reduce the number of viewports', () => {
const initialState = {
numRows: 1,
numColumns: 3,
viewportSpecificData: {
0: { viewportData0: 'vtkData0' },
1: { viewportData1: 'vtkData1' },
2: { viewportData2: 'vtkData2' },
},
layout: {
viewports: [{ plugin: 'vtk' }, { plugin: 'vtk' }, { plugin: 'vtk' }],
},
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT_LAYOUT_AND_DATA,
numRows: 1,
numColumns: 1,
viewports: [{ plugin: 'cornerstone' }],
viewportSpecificData: {
0: { viewportData0: 'cornerstoneData0' },
},
};
const expectedState = {
numRows: 1,
numColumns: 1,
viewportSpecificData: {
0: { viewportData0: 'cornerstoneData0' },
},
layout: {
viewports: [{ plugin: 'cornerstone' }],
},
activeViewportIndex: 0,
};
Reducer(reducer)
.withState(initialState)
.expect(action)
.toReturnState(expectedState);
});
it('should handle SET_VIEWPORT when we only set one viewport specific data', () => {
const initialState = {
numRows: 1,
numColumns: 2,
viewportSpecificData: {
0: { viewportData0: 'data0' },
1: { viewportData1: 'data1' },
},
layout: {
viewports: [{ plugin: 'cornerstone' }, { plugin: 'cornerstone' }],
},
activeViewportIndex: 0,
};
const action = {
type: types.SET_VIEWPORT,
viewportIndex: 1,
viewportSpecificData: {
viewportData1: 'NEWdata1',
},
};
const expectedState = {
numRows: 1,
numColumns: 2,
viewportSpecificData: {
0: { viewportData0: 'data0' },
1: { viewportData1: 'NEWdata1' },
},
layout: {
viewports: [{ plugin: 'cornerstone' }, { plugin: 'cornerstone' }],
},
activeViewportIndex: 0,
};
Reducer(reducer)
.withState(initialState)
.expect(action)
.toReturnState(expectedState);
});
// If there were previous keys, this would have
// "merge" behavior, not a clear & set
// May be worth another test?
it('should handle SET_VIEWPORT', () => {
const viewportToSet = 0;
const setViewportAction = {
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.4.14](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.4.13...@ohif/viewer@3.4.14) (2020-02-06)
**Note:** Version bump only for package @ohif/viewer
## [3.4.13](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.4.12...@ohif/viewer@3.4.13) (2020-01-30)
**Note:** Version bump only for package @ohif/viewer
## [3.4.12](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.4.11...@ohif/viewer@3.4.12) (2020-01-30)
**Note:** Version bump only for package @ohif/viewer
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/viewer",
"version": "3.4.12",
"version": "3.4.14",
"description": "OHIF Viewer",
"author": "OHIF Contributors",
"license": "MIT",
@@ -45,12 +45,12 @@
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"@ohif/core": "^2.3.6",
"@ohif/core": "^2.3.8",
"@ohif/extension-cornerstone": "^2.2.2",
"@ohif/extension-dicom-html": "^1.1.0",
"@ohif/extension-dicom-microscopy": "^0.50.6",
"@ohif/extension-dicom-pdf": "^1.0.1",
"@ohif/extension-vtk": "^1.2.12",
"@ohif/extension-vtk": "^1.2.14",
"@ohif/i18n": "^0.52.5",
"@ohif/ui": "^1.1.9",
"@tanem/react-nprogress": "^1.1.25",
+31 -5
View File
@@ -1100,13 +1100,34 @@
pirates "^4.0.0"
source-map-support "^0.5.9"
"@babel/runtime@7.1.2", "@babel/runtime@7.5.5", "@babel/runtime@7.6.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3":
"@babel/runtime@7.1.2":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3"
integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@7.6.0":
version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205"
integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1"
integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
@@ -15660,10 +15681,10 @@ react-transition-group@^4.1.1:
loose-envify "^1.4.0"
prop-types "^15.6.2"
react-vtkjs-viewport@^0.3.9:
version "0.3.9"
resolved "https://registry.yarnpkg.com/react-vtkjs-viewport/-/react-vtkjs-viewport-0.3.9.tgz#dc3dd5323c4cbaf5978cd64af2794b6b4ed61642"
integrity sha512-Sc3dRRz8tRSdUrdgL8tuYwVEl0CTjaZfDLqP5ufMXH2KjwBt3T5bjpk4xvzFyPc9CG6ywEX5MSa6eQ+NNjaUkw==
react-vtkjs-viewport@^0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/react-vtkjs-viewport/-/react-vtkjs-viewport-0.8.2.tgz#cdccf156cb089d32b935ebc3dc5f31213ba17bef"
integrity sha512-2OPbU5y4ay+E6qfZw4sW19uqfBnNw9kAF1PaZ/Sk5XMEEKnebplEof9ZZtE6nhPImFqMCfu4TXzYVHIAPmwFYA==
dependencies:
date-fns "^2.2.1"
gl-matrix "^3.1.0"
@@ -16038,6 +16059,11 @@ regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.12.0:
version "0.12.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2:
version "0.13.3"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"