[React] Integrating UserPreferences + Hotkeys (#332)

* User Preferences - basic integration

* wip user prefs

* Creating ConnectedHeader

* Removing old UserPreferences

* Reverting studylistwithdata

* Initial hotkeys handler migration

* Setting keys after save

* Getting hotkeys from redux

* Adding windowslevel preset listeners

* Refactoring - moving hotkeys setup to ohif-core-hotkeysUtil

* Using hotkeysUtil method on userPreferences save

* Using context in the user preferences

* Adding redux store into localstorage

* Hotkeys - Fixing onResetToDefaults

* Mmoving from OHIFViewer-react to ohif-viewer
This commit is contained in:
Thiago Maltempi 2019-01-31 05:55:05 -02:00 committed by Erik Ziegler
parent fbcc4fcf40
commit 8a3056b9f0
26 changed files with 24557 additions and 448 deletions

23768
OHIFViewer-react/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,8 @@ class App extends Component {
static propTypes = { static propTypes = {
history: PropTypes.object.isRequired, history: PropTypes.object.isRequired,
user: PropTypes.object, user: PropTypes.object,
userManager: PropTypes.object,
location: PropTypes.object,
} }
componentDidMount() { componentDidMount() {
@ -97,6 +99,13 @@ class App extends Component {
path="/IHEInvokeImageDisplay" path="/IHEInvokeImageDisplay"
component={IHEInvokeImageDisplay} component={IHEInvokeImageDisplay}
/> />
<Route path="/silent-refresh.html" onEnter={reload} />
<Route path="/logout-redirect.html" onEnter={reload} />
<Route exact path='/login' component={() => {
userManager.signinRedirect();
}}
/>
<Route path="/callback" component={CallbackPage} />
<Route render={() => <Route render={() =>
<div> Sorry, this page does not exist. </div>} <div> Sorry, this page does not exist. </div>}
/> />

View File

@ -0,0 +1,24 @@
import { connect } from 'react-redux';
import Header from './Header.js';
import { setUserPreferencesModalOpen } from '../../redux/actions.js';
const mapStateToProps = state => {
return {
isOpen: state.ui.userPreferencesModalOpen,
};
};
const mapDispatchToProps = dispatch => {
return {
openUserPreferencesModal: () => {
dispatch(setUserPreferencesModalOpen(true))
}
};
};
const ConnectedHeader = connect(
mapStateToProps,
mapDispatchToProps
)(Header);
export default ConnectedHeader;

View File

@ -1,22 +1,50 @@
import React from 'react'; import React, { Component } from "react";
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Link, withRouter } from 'react-router-dom'; import { Link, withRouter } from 'react-router-dom';
import { Dropdown } from "react-viewerbase"; import { Dropdown } from "react-viewerbase";
import './Header.css'; import './Header.css';
import list from './HeaderMenuList.json'; import ConnectedUserPreferencesModal from "../../connectedComponents/ConnectedUserPreferencesModal";
//import Icons from "../../images/icons.svg";
const Icons = '/icons.svg'; const Icons = '/icons.svg';
function Header({ home, location }) { class Header extends Component {
const { state } = location
return ( static propTypes = {
<div className={`entry-header ${home ? 'header-big' : ''}`}> home: PropTypes.bool.isRequired,
location: PropTypes.object,
openUserPreferencesModal: PropTypes.func,
};
static defaultProps = {
home: true
};
constructor(props) {
super(props);
this.state = {
userPreferencesOpen: false,
};
this.options = [
{
title: 'Preferences ',
icon: 'fa fa-user',
onClick: this.props.openUserPreferencesModal,
},
{
title: 'About',
icon: 'fa fa-info',
link: 'http://ohif.org',
}
];
}
render() {
return (<div className={`entry-header ${this.props.home ? 'header-big' : ''}`}>
<div className='header-left-box'> <div className='header-left-box'>
{ {
state && state.studyLink && this.props.location && this.props.location.studyLink &&
<Link to={state.studyLink} className="header-btn header-viewerLink"> <Link to={this.props.location.studyLink} className="header-btn header-viewerLink">
Back to Viewer Back to Viewer
</Link> </Link>
} }
@ -28,10 +56,10 @@ function Header({ home, location }) {
<div className="header-logo-text">Open Health Imaging Foundation</div> <div className="header-logo-text">Open Health Imaging Foundation</div>
</a> </a>
{!home && {!this.props.home &&
<Link className='header-btn header-studyListLinkSection' to={{ <Link className='header-btn header-studyListLinkSection' to={{
pathname: "/", pathname: "/",
state: { studyLink: location.pathname } state: { studyLink: this.props.location.pathname }
}}>Study list</Link> }}>Study list</Link>
} }
</div> </div>
@ -43,22 +71,15 @@ function Header({ home, location }) {
</span> </span>
<Dropdown <Dropdown
title='Options' title='Options'
list={list} list={this.options}
align='right' align='right'
/> />
<ConnectedUserPreferencesModal />
</div> </div>
</div> </div>
) );
}
} }
Header.propTypes = {
home: PropTypes.bool.isRequired,
location: PropTypes.object.isRequired
};
Header.defaultProps = {
home: true
};
export default withRouter(Header) export default withRouter(Header)

View File

@ -0,0 +1,15 @@
import UserPreferences from "../UserPreferences/UserPreferences";
export default [
{
"title": "Preferences",
"icon": "fa fa-user",
"onClick": UserPreferences,
"state": { "modal": true }
},
{
"title": "About",
"icon": "fa fa-info",
"link": "http://ohif.org"
}
];

View File

@ -1,12 +0,0 @@
[
{
"title": "Preferences",
"icon": "fa fa-user",
"link": "http://www.google.com"
},
{
"title": "About",
"icon": "fa fa-info",
"link": "http://ohif.org"
}
]

View File

@ -0,0 +1,44 @@
import { connect } from 'react-redux';
import { UserPreferencesModal } from 'react-viewerbase';
import OHIF from 'ohif-core';
import { setUserPreferencesModalOpen } from '../redux/actions.js';
import cloneDeep from 'lodash.clonedeep';
const { setUserPreferences } = OHIF.redux.actions;
const mapStateToProps = state => {
const contextName = window.store.getState().commandContext.context;
return {
isOpen: state.ui.userPreferencesModalOpen,
windowLevelData: state.preferences[contextName] ? state.preferences[contextName].windowLevelData : {},
hotKeysData: state.preferences[contextName] ? state.preferences[contextName].hotKeysData : {},
};
};
const mapDispatchToProps = dispatch => {
return {
onCancel: () => {
dispatch(setUserPreferencesModalOpen(false));
},
onSave: data => {
const contextName = window.store.getState().commandContext.context;
const preferences = cloneDeep(window.store.getState().preferences)
preferences[contextName] = data;
dispatch(setUserPreferences(preferences));
dispatch(setUserPreferencesModalOpen(false));
OHIF.hotkeysUtil.setHotkeys(data.hotKeysData);
},
onResetToDefaults: () => {
dispatch(setUserPreferences());
dispatch(setUserPreferencesModalOpen(false));
OHIF.hotkeysUtil.setHotkeys();
},
};
};
const ConnectedUserPreferencesModal = connect(
mapStateToProps,
mapDispatchToProps
)(UserPreferencesModal);
export default ConnectedUserPreferencesModal;

View File

@ -2,12 +2,12 @@ import React, { Component } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
//import { CineDialog } from 'react-viewerbase'; //import { CineDialog } from 'react-viewerbase';
import Header from '../components/Header'
import ConnectedFlexboxLayout from './ConnectedFlexboxLayout.js'; import ConnectedFlexboxLayout from './ConnectedFlexboxLayout.js';
import ConnectedToolbarRow from './ConnectedToolbarRow'; import ConnectedToolbarRow from './ConnectedToolbarRow';
import ConnectedStudyLoadingMonitor from './ConnectedStudyLoadingMonitor.js'; import ConnectedStudyLoadingMonitor from './ConnectedStudyLoadingMonitor.js';
import StudyPrefetcher from '../components/StudyPrefetcher.js'; import StudyPrefetcher from '../components/StudyPrefetcher.js';
import './Viewer.css'; import './Viewer.css';
import ConnectedHeader from "../components/Header/ConnectedHeader";
/** /**
* Inits OHIF Hanging Protocol's onReady. * Inits OHIF Hanging Protocol's onReady.
@ -52,7 +52,7 @@ class Viewer extends Component {
render() { render() {
return (<> return (<>
<Header home={false}/> <ConnectedHeader home={false} />
<div className='viewerDialogs'> <div className='viewerDialogs'>
</div> </div>
<div id="viewer" className='Viewer'> <div id="viewer" className='Viewer'>

View File

@ -14,6 +14,11 @@ class ViewerMain extends Component {
studies: PropTypes.array.isRequired studies: PropTypes.array.isRequired
}; };
constructor(props) {
super(props);
OHIF.hotkeysUtil.setup('viewer');
}
getDisplaySets(studies) { getDisplaySets(studies) {
const displaySets = []; const displaySets = [];
studies.forEach((study) => { studies.forEach((study) => {

View File

@ -8,6 +8,7 @@ import OHIF from 'ohif-core';
import './config'; import './config';
import ui from './redux/ui.js'; import ui from './redux/ui.js';
import App from './App.js'; import App from './App.js';
import { loadState, saveState } from './redux/localStorageState.js';
import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js"; import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js";
//import ConnectedExampleViewportPlugin from './components/ConnectedExampleViewportPlugin.js'; //import ConnectedExampleViewportPlugin from './components/ConnectedExampleViewportPlugin.js';
@ -15,13 +16,20 @@ import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstone
import OHIFDicomPDFViewportPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFViewportPlugin.js'; import OHIFDicomPDFViewportPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFViewportPlugin.js';
import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js'; import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js';
const reducers = OHIF.redux.reducers; let reducers = OHIF.redux.reducers;
reducers.ui = ui; reducers.ui = ui;
reducers.oidc = oidcReducer; reducers.oidc = oidcReducer;
const Icons = '/icons.svg'; const Icons = '/icons.svg';
const combined = combineReducers(reducers) const combined = combineReducers(reducers);
const store = createStore(combined); const store = createStore(combined, loadState());
// Subscribing store to save state of persistable data
store.subscribe(() => {
saveState({
preferences: store.getState().preferences,
});
});
// Note: Run your build like this: // Note: Run your build like this:
// REACT_APP_CONFIG=$(cat ../config-react/ccc.json) yarn start // REACT_APP_CONFIG=$(cat ../config-react/ccc.json) yarn start
@ -159,6 +167,36 @@ const pdfPluginAction = OHIF.redux.actions.addPlugin({
component: OHIFDicomPDFViewportPlugin component: OHIFDicomPDFViewportPlugin
}); });
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",
"wadoUriRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
"qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
// "wadoUriRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/wado",
// "qidoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
// "wadoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
"qidoSupportsIncludeField": true,
"imageRendering": "wadors",
"thumbnailRendering": "wadors",
"requestOptions": {
"requestFromBrowser": true,
"logRequests": true,
"logResponses": false,
"logTiming": true,
//"auth": "admin:admin"
//"auth": "cloud:healthcare"
}
}
]
};
OHIF.utils.addServers(servers, store);
const pdfPluginActionSopClass = OHIF.redux.actions.addPlugin({ const pdfPluginActionSopClass = OHIF.redux.actions.addPlugin({
id: 'pdf_sopClassHandler', id: 'pdf_sopClassHandler',
type: PLUGIN_TYPES.SOP_CLASS_HANDLER, type: PLUGIN_TYPES.SOP_CLASS_HANDLER,

View File

@ -8,9 +8,15 @@ export const setRightSidebarOpen = state => ({
state state
}); });
export const setUserPreferencesModalOpen = state => ({
type: 'SET_USER_PREFERENCES_MODAL_OPEN',
state
});
const actions = { const actions = {
setLeftSidebarOpen, setLeftSidebarOpen,
setRightSidebarOpen setRightSidebarOpen,
setUserPreferencesModalOpen
}; };
export default actions; export default actions;

View File

@ -0,0 +1,21 @@
export const loadState = () => {
try {
const serializedState = window.localStorage.getItem('state');
if (!serializedState) {
return undefined;
}
return JSON.parse(serializedState)
} catch (e) {
return undefined;
}
}
export const saveState = (state) => {
try {
const serializedState = JSON.stringify(state);
localStorage.setItem('state', serializedState);
} catch (e) {
console.warn(e);
}
}

View File

@ -1,6 +1,7 @@
const defaultState = { const defaultState = {
leftSidebarOpen: true, leftSidebarOpen: true,
rightSidebarOpen: false, rightSidebarOpen: false,
userPreferencesModalOpen: false
} }
const ui = (state = defaultState, action) => { const ui = (state = defaultState, action) => {
@ -9,6 +10,8 @@ const ui = (state = defaultState, action) => {
return Object.assign({}, state, { leftSidebarOpen: action.state }); return Object.assign({}, state, { leftSidebarOpen: action.state });
case 'SET_RIGHT_SIDEBAR_OPEN': case 'SET_RIGHT_SIDEBAR_OPEN':
return Object.assign({}, state, { rightSidebarOpen: action.state }); return Object.assign({}, state, { rightSidebarOpen: action.state });
case 'SET_USER_PREFERENCES_MODAL_OPEN':
return Object.assign({}, state, { userPreferencesModalOpen: action.state });
default: default:
return state; return state;
} }

View File

@ -2,8 +2,8 @@ import React, { Component } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import OHIF from 'ohif-core'; import OHIF from 'ohif-core';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import { StudyList } from "react-viewerbase"; import { StudyList } from 'react-viewerbase';
import Header from "../components/Header"; import ConnectedHeader from "../components/Header/ConnectedHeader";
class StudyListWithData extends Component { class StudyListWithData extends Component {
state = { state = {
@ -96,7 +96,7 @@ class StudyListWithData extends Component {
const studyCount = this.state.studies ? this.state.studies.length : 0; const studyCount = this.state.studies ? this.state.studies.length : 0;
return (<> return (<>
<Header home={true} user={this.props.user}/> <ConnectedHeader home={true} user={this.props.user} />
<StudyList studies={this.state.studies} <StudyList studies={this.state.studies}
studyCount={studyCount} studyCount={studyCount}
studyListFunctionsEnabled={false} studyListFunctionsEnabled={false}

View File

@ -50,11 +50,11 @@
source-map "^0.5.0" source-map "^0.5.0"
"@babel/generator@^7.1.6", "@babel/generator@^7.2.2": "@babel/generator@^7.1.6", "@babel/generator@^7.2.2":
version "7.2.2" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.0.tgz#f663838cd7b542366de3aa608a657b8ccb2a99eb"
integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== integrity sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg==
dependencies: dependencies:
"@babel/types" "^7.2.2" "@babel/types" "^7.3.0"
jsesc "^2.5.1" jsesc "^2.5.1"
lodash "^4.17.10" lodash "^4.17.10"
source-map "^0.5.0" source-map "^0.5.0"
@ -75,12 +75,12 @@
"@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/helper-explode-assignable-expression" "^7.1.0"
"@babel/types" "^7.0.0" "@babel/types" "^7.0.0"
"@babel/helper-builder-react-jsx@^7.0.0": "@babel/helper-builder-react-jsx@^7.3.0":
version "7.0.0" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4"
integrity sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw== integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==
dependencies: dependencies:
"@babel/types" "^7.0.0" "@babel/types" "^7.3.0"
esutils "^2.0.0" esutils "^2.0.0"
"@babel/helper-call-delegate@^7.1.0": "@babel/helper-call-delegate@^7.1.0":
@ -92,10 +92,10 @@
"@babel/traverse" "^7.1.0" "@babel/traverse" "^7.1.0"
"@babel/types" "^7.0.0" "@babel/types" "^7.0.0"
"@babel/helper-create-class-features-plugin@^7.2.3": "@babel/helper-create-class-features-plugin@^7.3.0":
version "7.2.3" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.3.tgz#f6e719abb90cb7f4a69591e35fd5eb89047c4a7c" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz#2b01a81b3adc2b1287f9ee193688ef8dc71e718f"
integrity sha512-xO/3Gn+2C7/eOUeb0VRnSP1+yvWHNxlpAot1eMhtoKDCN7POsyQP5excuT5UsV5daHxMWBeIIOeI5cmB8vMRgQ== integrity sha512-DUsQNS2CGLZZ7I3W3fvh0YpPDd6BuWJlDl+qmZZpABZHza2ErE3LxtEzLJFHFC1ZwtlAXvHhbFYbtM5o5B0WBw==
dependencies: dependencies:
"@babel/helper-function-name" "^7.1.0" "@babel/helper-function-name" "^7.1.0"
"@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-member-expression-to-functions" "^7.0.0"
@ -235,13 +235,13 @@
"@babel/types" "^7.2.0" "@babel/types" "^7.2.0"
"@babel/helpers@^7.1.5", "@babel/helpers@^7.2.0": "@babel/helpers@^7.1.5", "@babel/helpers@^7.2.0":
version "7.2.0" version "7.3.1"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9"
integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==
dependencies: dependencies:
"@babel/template" "^7.1.2" "@babel/template" "^7.1.2"
"@babel/traverse" "^7.1.5" "@babel/traverse" "^7.1.5"
"@babel/types" "^7.2.0" "@babel/types" "^7.3.0"
"@babel/highlight@^7.0.0": "@babel/highlight@^7.0.0":
version "7.0.0" version "7.0.0"
@ -253,9 +253,9 @@
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.0.0", "@babel/parser@^7.1.6", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": "@babel/parser@^7.0.0", "@babel/parser@^7.1.6", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3":
version "7.2.3" version "7.3.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.1.tgz#8f4ffd45f779e6132780835ffa7a215fa0b2d181"
integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== integrity sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==
"@babel/plugin-proposal-async-generator-functions@^7.1.0", "@babel/plugin-proposal-async-generator-functions@^7.2.0": "@babel/plugin-proposal-async-generator-functions@^7.1.0", "@babel/plugin-proposal-async-generator-functions@^7.2.0":
version "7.2.0" version "7.2.0"
@ -279,11 +279,11 @@
"@babel/plugin-syntax-class-properties" "^7.0.0" "@babel/plugin-syntax-class-properties" "^7.0.0"
"@babel/plugin-proposal-class-properties@^7.2.3": "@babel/plugin-proposal-class-properties@^7.2.3":
version "7.2.3" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.3.tgz#c9e1294363b346cff333007a92080f3203698461" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd"
integrity sha512-FVuQngLoN2iDrpW7LmhPZ2sO4DJxf35FOcwidwB9Ru9tMvI5URthnkVHuG14IStV+TzkMTyLMoOUlSTtrdVwqw== integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==
dependencies: dependencies:
"@babel/helper-create-class-features-plugin" "^7.2.3" "@babel/helper-create-class-features-plugin" "^7.3.0"
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-decorators@7.1.6": "@babel/plugin-proposal-decorators@7.1.6":
@ -312,10 +312,10 @@
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-object-rest-spread" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.2.0": "@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.3.1":
version "7.2.0" version "7.3.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz#f69fb6a1ea6a4e1c503994a91d9cf76f3c4b36e8"
integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== integrity sha512-Nmmv1+3LqxJu/V5jU9vJmxR/KIRWFk2qLHmbB56yRRRFhlaSuOVXscX3gUmhaKgUhzA3otOHVubbIEVYsZ0eZg==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
@ -574,6 +574,13 @@
"@babel/helper-module-transforms" "^7.1.0" "@babel/helper-module-transforms" "^7.1.0"
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50"
integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==
dependencies:
regexp-tree "^0.1.0"
"@babel/plugin-transform-new-target@^7.0.0": "@babel/plugin-transform-new-target@^7.0.0":
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a"
@ -645,11 +652,11 @@
"@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-syntax-jsx" "^7.2.0"
"@babel/plugin-transform-react-jsx@^7.0.0": "@babel/plugin-transform-react-jsx@^7.0.0":
version "7.2.0" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz#ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290"
integrity sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q== integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==
dependencies: dependencies:
"@babel/helper-builder-react-jsx" "^7.0.0" "@babel/helper-builder-react-jsx" "^7.3.0"
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-syntax-jsx" "^7.2.0"
@ -780,18 +787,19 @@
semver "^5.3.0" semver "^5.3.0"
"@babel/preset-env@^7.0.0": "@babel/preset-env@^7.0.0":
version "7.2.3" version "7.3.1"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db"
integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== integrity sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==
dependencies: dependencies:
"@babel/helper-module-imports" "^7.0.0" "@babel/helper-module-imports" "^7.0.0"
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
"@babel/plugin-proposal-json-strings" "^7.2.0" "@babel/plugin-proposal-json-strings" "^7.2.0"
"@babel/plugin-proposal-object-rest-spread" "^7.2.0" "@babel/plugin-proposal-object-rest-spread" "^7.3.1"
"@babel/plugin-proposal-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.2.0" "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
"@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-async-generators" "^7.2.0"
"@babel/plugin-syntax-json-strings" "^7.2.0"
"@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
"@babel/plugin-transform-arrow-functions" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0"
@ -811,6 +819,7 @@
"@babel/plugin-transform-modules-commonjs" "^7.2.0" "@babel/plugin-transform-modules-commonjs" "^7.2.0"
"@babel/plugin-transform-modules-systemjs" "^7.2.0" "@babel/plugin-transform-modules-systemjs" "^7.2.0"
"@babel/plugin-transform-modules-umd" "^7.2.0" "@babel/plugin-transform-modules-umd" "^7.2.0"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
"@babel/plugin-transform-new-target" "^7.0.0" "@babel/plugin-transform-new-target" "^7.0.0"
"@babel/plugin-transform-object-super" "^7.2.0" "@babel/plugin-transform-object-super" "^7.2.0"
"@babel/plugin-transform-parameters" "^7.2.0" "@babel/plugin-transform-parameters" "^7.2.0"
@ -860,9 +869,9 @@
regenerator-runtime "^0.12.0" regenerator-runtime "^0.12.0"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0": "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0":
version "7.2.0" version "7.3.1"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a"
integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==
dependencies: dependencies:
regenerator-runtime "^0.12.0" regenerator-runtime "^0.12.0"
@ -890,10 +899,10 @@
globals "^11.1.0" globals "^11.1.0"
lodash "^4.17.10" lodash "^4.17.10"
"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2": "@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0":
version "7.2.2" version "7.3.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0"
integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== integrity sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==
dependencies: dependencies:
esutils "^2.0.2" esutils "^2.0.2"
lodash "^4.17.10" lodash "^4.17.10"
@ -1499,15 +1508,15 @@ atob@^2.1.1:
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^9.3.1: autoprefixer@^9.3.1:
version "9.4.5" version "9.4.6"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.5.tgz#a13ccb001e4bc8837f71c3354005b42f02cc03d7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.6.tgz#0ace275e33b37de16b09a5547dbfe73a98c1d446"
integrity sha512-M602C0ZxzFpJKqD4V6eq2j+K5CkzlhekCrcQupJmAOrPEZjWJyj/wSeo6qRSNoN6M3/9mtLPQqTTrABfReytQg== integrity sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==
dependencies: dependencies:
browserslist "^4.4.0" browserslist "^4.4.1"
caniuse-lite "^1.0.30000928" caniuse-lite "^1.0.30000929"
normalize-range "^0.1.2" normalize-range "^0.1.2"
num2fraction "^1.2.2" num2fraction "^1.2.2"
postcss "^7.0.11" postcss "^7.0.13"
postcss-value-parser "^3.3.1" postcss-value-parser "^3.3.1"
aws-sign2@~0.7.0: aws-sign2@~0.7.0:
@ -2051,13 +2060,13 @@ browserslist@4.1.1:
electron-to-chromium "^1.3.62" electron-to-chromium "^1.3.62"
node-releases "^1.0.0-alpha.11" node-releases "^1.0.0-alpha.11"
browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.3.4, browserslist@^4.4.0: browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.3.4, browserslist@^4.4.1:
version "4.4.0" version "4.4.1"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.0.tgz#7050d1412cbfc5274aba609ed5e50359ca1a5fdf" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062"
integrity sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw== integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==
dependencies: dependencies:
caniuse-lite "^1.0.30000928" caniuse-lite "^1.0.30000929"
electron-to-chromium "^1.3.100" electron-to-chromium "^1.3.103"
node-releases "^1.1.3" node-releases "^1.1.3"
bser@^2.0.0: bser@^2.0.0:
@ -2244,10 +2253,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2" lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0" lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000905, caniuse-lite@^1.0.30000928: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30000905, caniuse-lite@^1.0.30000929:
version "1.0.30000929" version "1.0.30000932"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz#7b391b781a9c3097ecc39ea053301aea8ea16317" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz#d01763e9ce77810962ca7391ff827b5949ce4272"
integrity sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw== integrity sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A==
capture-exit@^1.2.0: capture-exit@^1.2.0:
version "1.2.0" version "1.2.0"
@ -2761,9 +2770,9 @@ core-js@^1.0.0:
integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7:
version "2.6.2" version "2.6.3"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49"
integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== integrity sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==
core-js@~2.3.0: core-js@~2.3.0:
version "2.3.0" version "2.3.0"
@ -3358,9 +3367,9 @@ diffie-hellman@^5.0.0:
randombytes "^2.0.0" randombytes "^2.0.0"
dir-glob@^2.0.0: dir-glob@^2.0.0:
version "2.2.1" version "2.2.2"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.1.tgz#ce8413234ffe8452b76b7741c32f116cf2a7b1a7" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
integrity sha512-UN6X6XwRjllabfRhBdkVSo63uurJ8nSvMGrwl94EYVz6g+exhTV+yVSYk5VC/xl3MBFBTtC0J20uFKce4Brrng== integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
dependencies: dependencies:
path-type "^3.0.0" path-type "^3.0.0"
@ -3543,10 +3552,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.100, electron-to-chromium@^1.3.62: electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.62:
version "1.3.103" version "1.3.108"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.108.tgz#2e79a6fcaa4b3e7c75abf871505bda8e268c910e"
integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== integrity sha512-/QI4hMpAh48a1Sea6PALGv+kuVne9A2EWGd8HrWHMdYhIzGtbhVVHh6heL5fAzGaDnZuPyrlWJRl8WPm4RyiQQ==
elliptic@^6.0.0: elliptic@^6.0.0:
version "6.4.1" version "6.4.1"
@ -3710,12 +3719,12 @@ eslint-loader@2.1.1:
rimraf "^2.6.1" rimraf "^2.6.1"
eslint-module-utils@^2.2.0: eslint-module-utils@^2.2.0:
version "2.2.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49"
integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==
dependencies: dependencies:
debug "^2.6.8" debug "^2.6.8"
pkg-dir "^1.0.0" pkg-dir "^2.0.0"
eslint-plugin-flowtype@2.50.1: eslint-plugin-flowtype@2.50.1:
version "2.50.1" version "2.50.1"
@ -4490,9 +4499,9 @@ fsevents@1.2.4:
node-pre-gyp "^0.10.0" node-pre-gyp "^0.10.0"
fsevents@^1.2.2, fsevents@^1.2.3: fsevents@^1.2.2, fsevents@^1.2.3:
version "1.2.6" version "1.2.7"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.6.tgz#d3a1864a71876a2eb9b244e3bd8f606eb09568c0" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4"
integrity sha512-BalK54tfK0pMC0jQFb2oHn1nz7JNQD/2ex5pBnCHgBi2xG7VV0cAOGy2RS2VbCqUXx5/6obMrMcQTJ8yjcGzbg== integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==
dependencies: dependencies:
nan "^2.9.2" nan "^2.9.2"
node-pre-gyp "^0.10.0" node-pre-gyp "^0.10.0"
@ -4953,11 +4962,11 @@ hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0:
integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1: hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1:
version "3.2.1" version "3.3.0"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b"
integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==
dependencies: dependencies:
react-is "^16.3.2" react-is "^16.7.0"
home-or-tmp@^2.0.0: home-or-tmp@^2.0.0:
version "2.0.0" version "2.0.0"
@ -6265,9 +6274,9 @@ jsbn@~0.1.0:
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
jsdom@>=11.0.0: jsdom@>=11.0.0:
version "13.1.0" version "13.2.0"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.1.0.tgz#fa7356f0cc8111d0f1077cb7800d06f22f1d66c7" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a"
integrity sha512-C2Kp0qNuopw0smXFaHeayvharqF3kkcNqlcIlSX71+3XrsOFwkEPLt/9f5JksMmaul2JZYIQuY+WTpqHpQQcLg== integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==
dependencies: dependencies:
abab "^2.0.0" abab "^2.0.0"
acorn "^6.0.4" acorn "^6.0.4"
@ -6284,7 +6293,7 @@ jsdom@>=11.0.0:
pn "^1.1.0" pn "^1.1.0"
request "^2.88.0" request "^2.88.0"
request-promise-native "^1.0.5" request-promise-native "^1.0.5"
saxes "^3.1.4" saxes "^3.1.5"
symbol-tree "^3.2.2" symbol-tree "^3.2.2"
tough-cookie "^2.5.0" tough-cookie "^2.5.0"
w3c-hr-time "^1.0.1" w3c-hr-time "^1.0.1"
@ -7194,9 +7203,9 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi
minimist "0.0.8" minimist "0.0.8"
moment@^2.22.2, moment@^2.23.0: moment@^2.22.2, moment@^2.23.0:
version "2.23.0" version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
@ -7814,10 +7823,10 @@ obuf@^1.0.0, obuf@^1.1.2:
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
ohif-core@^0.1.7: ohif-core@^0.1.7, ohif-core@^0.1.8:
version "0.1.7" version "0.1.8"
resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.7.tgz#81f49f142d40338a3839f06c849aace675847002" resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.8.tgz#af0ff273e9ad3096d5d98187191a336e08e72f93"
integrity sha512-VXnpaw4VjKBR1P9tSB2ZGLpXYXwdbmL0oZ7P+bbKKOh2Q+8An4E9lTiKpUlUoxaf/HiTZIUQ/2Cjp7qJe88FDg== integrity sha512-e5fIKDHOfVaYkrkKFjyqhad/vP7D2ynn2q77mNFMAX49Lo5y/WgXiXytJTeaXNJzksnzTQquOxA93XAh8viuWg==
dependencies: dependencies:
"@babel/runtime" "^7.2.0" "@babel/runtime" "^7.2.0"
dicomweb-client "^0.4.1" dicomweb-client "^0.4.1"
@ -8136,9 +8145,9 @@ param-case@2.1.x:
no-case "^2.2.0" no-case "^2.2.0"
parse-asn1@^5.0.0: parse-asn1@^5.0.0:
version "5.1.2" version "5.1.3"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.2.tgz#13efbaaac8da669a9751a6b50a7cfccfdef756ae" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204"
integrity sha512-zVAb35DsNvwINEA7EEK+78YoNDGRpYEAGoIl3bSHyI9OU4IIrrrU5DC4xaCLZ42gvOfQg1+wS778WbJW+mCMCQ== integrity sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==
dependencies: dependencies:
asn1.js "^4.0.0" asn1.js "^4.0.0"
browserify-aes "^1.0.0" browserify-aes "^1.0.0"
@ -8992,10 +9001,10 @@ postcss@^6.0.1, postcss@^6.0.23:
source-map "^0.6.1" source-map "^0.6.1"
supports-color "^5.4.0" supports-color "^5.4.0"
postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.2, postcss@^7.0.5: postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.2, postcss@^7.0.5:
version "7.0.13" version "7.0.14"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg== integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
dependencies: dependencies:
chalk "^2.4.2" chalk "^2.4.2"
source-map "^0.6.1" source-map "^0.6.1"
@ -9017,9 +9026,9 @@ preserve@^0.2.0:
integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
prettier@^1.14.2: prettier@^1.14.2:
version "1.15.3" version "1.16.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.1.tgz#534c2c9d7853f8845e5e078384e71973bd74089f"
integrity sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg== integrity sha512-XXUITwIkGb3CPJ2hforHah/zTINRyie5006Jd2HKy2qz7snEJXl0KLfsJZW/wst9g6R2rFvqba3VpNYdu1hDcA==
pretty-bytes@^4.0.2: pretty-bytes@^4.0.2:
version "4.0.2" version "4.0.2"
@ -9416,7 +9425,7 @@ react-error-overlay@^5.1.2:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.2.tgz#888957b884d4b25b083a82ad550f7aad96585394" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.2.tgz#888957b884d4b25b083a82ad550f7aad96585394"
integrity sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ== integrity sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ==
react-is@^16.3.2, react-is@^16.6.3: react-is@^16.3.2, react-is@^16.6.3, react-is@^16.7.0:
version "16.7.0" version "16.7.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa"
integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==
@ -9540,10 +9549,10 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.0:
prop-types "^15.6.2" prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4" react-lifecycles-compat "^3.0.4"
react-viewerbase@^0.2.1: react-viewerbase@^0.2.1, react-viewerbase@^0.2.2:
version "0.2.1" version "0.2.2"
resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.2.1.tgz#1c7f1927e47ea5efd80ebe457eba7c95f485726d" resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.2.2.tgz#b77d341c0dbb4efd4a63b1ae696ffd32668cb0e0"
integrity sha512-nDT1fIZ0HHgNf+GicvkuF9ZqSvkFjW8BHTMUnKkjW6rPPKUQ+zdAGQn4PyU1TH+rtfj67sqO6t1p0ekXX1nNgQ== integrity sha512-92x9Miraln+n3vtDLByT/2OUh6m4LdayZPrWIWy6Jw400H96x3JmuTFAC/ebYaQLllbns6AKVI0u6EXWjtQocg==
dependencies: dependencies:
"@babel/runtime" "^7.2.0" "@babel/runtime" "^7.2.0"
classnames "^2.2.6" classnames "^2.2.6"
@ -9834,6 +9843,15 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2" extend-shallow "^3.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
regexp-tree@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.0.tgz#a56ad7746097888ea16457479029ec9345b96ab0"
integrity sha512-rHQv+tzu+0l3KS/ERabas1yK49ahNVxuH40WcPg53CzP5p8TgmmyBgHELLyJcvjhTD0e5ahSY6C76LbEVtr7cg==
dependencies:
cli-table3 "^0.5.0"
colors "^1.1.2"
yargs "^10.0.3"
regexpp@^2.0.0: regexpp@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
@ -10059,20 +10077,13 @@ resolve@1.8.1:
dependencies: dependencies:
path-parse "^1.0.5" path-parse "^1.0.5"
resolve@^1.1.6: resolve@^1.1.6, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1:
version "1.10.0" version "1.10.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
dependencies: dependencies:
path-parse "^1.0.6" path-parse "^1.0.6"
resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
dependencies:
path-parse "^1.0.6"
restore-cursor@^2.0.0: restore-cursor@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@ -10207,7 +10218,7 @@ sax@^1.2.4, sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
saxes@^3.1.4: saxes@^3.1.5:
version "3.1.6" version "3.1.6"
resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.6.tgz#2d948a47b54918516c5a64096f08865deb5bd8cd" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.6.tgz#2d948a47b54918516c5a64096f08865deb5bd8cd"
integrity sha512-LAYs+lChg1v5uKNzPtsgTxSS5hLo8aIhSMCJt1WMpefAxm3D1RTpMwSpb6ebdL31cubiLTnhokVktBW+cv9Y9w== integrity sha512-LAYs+lChg1v5uKNzPtsgTxSS5hLo8aIhSMCJt1WMpefAxm3D1RTpMwSpb6ebdL31cubiLTnhokVktBW+cv9Y9w==
@ -10707,9 +10718,9 @@ sprintf-js@~1.0.2:
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sshpk@^1.7.0: sshpk@^1.7.0:
version "1.16.0" version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
integrity sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ== integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
dependencies: dependencies:
asn1 "~0.2.3" asn1 "~0.2.3"
assert-plus "^1.0.0" assert-plus "^1.0.0"
@ -10769,9 +10780,9 @@ stealthy-require@^1.1.0:
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
stream-browserify@^2.0.1: stream-browserify@^2.0.1:
version "2.0.1" version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
dependencies: dependencies:
inherits "~2.0.1" inherits "~2.0.1"
readable-stream "^2.0.2" readable-stream "^2.0.2"
@ -12023,7 +12034,7 @@ wrappy@1, wrappy@~1.0.2:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0:
version "2.4.2" version "2.4.2"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9"
integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==
@ -12032,15 +12043,6 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
signal-exit "^3.0.2" signal-exit "^3.0.2"
write-file-atomic@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
dependencies:
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
write@^0.2.1: write@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
@ -12056,9 +12058,9 @@ ws@^5.2.0:
async-limiter "~1.0.0" async-limiter "~1.0.0"
ws@^6.1.2: ws@^6.1.2:
version "6.1.2" version "6.1.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.3.tgz#d2d2e5f0e3c700ef2de89080ebc0ac6e1bf3a72d"
integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== integrity sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==
dependencies: dependencies:
async-limiter "~1.0.0" async-limiter "~1.0.0"
@ -12114,6 +12116,13 @@ yargs-parser@^10.1.0:
dependencies: dependencies:
camelcase "^4.1.0" camelcase "^4.1.0"
yargs-parser@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
dependencies:
camelcase "^4.1.0"
yargs-parser@^9.0.2: yargs-parser@^9.0.2:
version "9.0.2" version "9.0.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@ -12139,6 +12148,24 @@ yargs@12.0.2:
y18n "^3.2.1 || ^4.0.0" y18n "^3.2.1 || ^4.0.0"
yargs-parser "^10.1.0" yargs-parser "^10.1.0"
yargs@^10.0.3:
version "10.1.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
dependencies:
cliui "^4.0.0"
decamelize "^1.1.1"
find-up "^2.1.0"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^8.1.0"
yargs@^11.0.0: yargs@^11.0.0:
version "11.1.0" version "11.1.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"

View File

@ -13,7 +13,7 @@ import OHIFDicomPDFViewportPlugin from './connectedComponents/OHIFDicomPDFViewpo
import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js'; import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js';
import DicomMicroscopySopClassHandlerPlugin from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopySopClassHandlerPlugin.js'; import DicomMicroscopySopClassHandlerPlugin from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopySopClassHandlerPlugin.js';
import DicomMicroscopyViewport from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopyViewport.js'; import DicomMicroscopyViewport from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopyViewport.js';
import { loadState, saveState } from './redux/localStorageState.js';
import { import {
loadUser, loadUser,
OidcProvider, OidcProvider,
@ -26,13 +26,18 @@ import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
const Icons = '/icons.svg'; const Icons = '/icons.svg';
const reducers = OHIF.redux.reducers; let reducers = OHIF.redux.reducers;
reducers.ui = ui; reducers.ui = ui;
reducers.oidc = oidcReducer; reducers.oidc = oidcReducer;
const combined = combineReducers(reducers); const combined = combineReducers(reducers);
const store = createStore(combined, loadState());
const store = createStore(combined); store.subscribe(() => {
saveState({
preferences: store.getState().preferences
});
});
const defaultButtons = [ const defaultButtons = [
{ {
@ -206,7 +211,9 @@ class App extends Component {
static propTypes = { static propTypes = {
servers: PropTypes.object, servers: PropTypes.object,
oidc: PropTypes.array, oidc: PropTypes.array,
routerBasename: PropTypes.string routerBasename: PropTypes.string,
userManager: PropTypes.object,
location: PropTypes.object
}; };
static defaultProps = { static defaultProps = {

View File

@ -1,38 +1,69 @@
import React from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Link, withRouter } from 'react-router-dom'; import { Link, withRouter } from 'react-router-dom';
import { Dropdown } from 'react-viewerbase'; import { Dropdown } from 'react-viewerbase';
import './Header.css'; import './Header.css';
import list from './HeaderMenuList.json';
import OHIFLogo from '../OHIFLogo/OHIFLogo.js'; import OHIFLogo from '../OHIFLogo/OHIFLogo.js';
import ConnectedUserPreferencesModal from '../../connectedComponents/ConnectedUserPreferencesModal.js';
//import Icons from "../../images/icons.svg"; //import Icons from "../../images/icons.svg";
//const Icons = '/icons.svg'; //const Icons = '/icons.svg';
function Header({ home, location, children }) { class Header extends Component {
const { state } = location; static propTypes = {
home: PropTypes.bool.isRequired,
location: PropTypes.object.isRequired,
openUserPreferencesModal: PropTypes.func,
children: PropTypes.node
};
if (!children) { static defaultProps = {
children = OHIFLogo(); home: true,
children: OHIFLogo()
};
constructor(props) {
super(props);
this.state = {
userPreferencesOpen: false
};
this.options = [
{
title: 'Preferences ',
icon: 'fa fa-user',
onClick: this.props.openUserPreferencesModal
},
{
title: 'About',
icon: 'fa fa-info',
link: 'http://ohif.org'
}
];
} }
render() {
return ( return (
<div className={`entry-header ${home ? 'header-big' : ''}`}> <div className={`entry-header ${this.props.home ? 'header-big' : ''}`}>
<div className="header-left-box"> <div className="header-left-box">
{state && state.studyLink && ( {this.props.location && this.props.location.studyLink && (
<Link to={state.studyLink} className="header-btn header-viewerLink"> <Link
to={this.props.location.studyLink}
className="header-btn header-viewerLink"
>
Back to Viewer Back to Viewer
</Link> </Link>
)} )}
{children} {this.props.children}
{!home && ( {!this.props.home && (
<Link <Link
className="header-btn header-studyListLinkSection" className="header-btn header-studyListLinkSection"
to={{ to={{
pathname: '/', pathname: '/',
state: { studyLink: location.pathname } state: { studyLink: this.props.location.pathname }
}} }}
> >
Study list Study list
@ -42,20 +73,12 @@ function Header({ home, location, children }) {
<div className="header-menu"> <div className="header-menu">
<span className="research-use">INVESTIGATIONAL USE ONLY</span> <span className="research-use">INVESTIGATIONAL USE ONLY</span>
<Dropdown title="Options" list={list} align="right" /> <Dropdown title="Options" list={this.options} align="right" />
<ConnectedUserPreferencesModal />
</div> </div>
</div> </div>
); );
} }
}
Header.propTypes = {
home: PropTypes.bool.isRequired,
location: PropTypes.object.isRequired,
children: PropTypes.node
};
Header.defaultProps = {
home: true
};
export default withRouter(Header); export default withRouter(Header);

View File

@ -1,12 +0,0 @@
[
{
"title": "Preferences",
"icon": "fa fa-user",
"link": "http://www.google.com"
},
{
"title": "About",
"icon": "fa fa-info",
"link": "http://ohif.org"
}
]

View File

@ -0,0 +1,24 @@
import { connect } from 'react-redux';
import Header from '../components/Header/Header.js';
import { setUserPreferencesModalOpen } from '../redux/actions.js';
const mapStateToProps = state => {
return {
isOpen: state.ui.userPreferencesModalOpen
};
};
const mapDispatchToProps = dispatch => {
return {
openUserPreferencesModal: () => {
dispatch(setUserPreferencesModalOpen(true));
}
};
};
const ConnectedHeader = connect(
mapStateToProps,
mapDispatchToProps
)(Header);
export default ConnectedHeader;

View File

@ -0,0 +1,48 @@
import { connect } from 'react-redux';
import { UserPreferencesModal } from 'react-viewerbase';
import OHIF from 'ohif-core';
import { setUserPreferencesModalOpen } from '../redux/actions.js';
import cloneDeep from 'lodash.clonedeep';
const { setUserPreferences } = OHIF.redux.actions;
const mapStateToProps = state => {
const contextName = window.store.getState().commandContext.context;
return {
isOpen: state.ui.userPreferencesModalOpen,
windowLevelData: state.preferences[contextName]
? state.preferences[contextName].windowLevelData
: {},
hotKeysData: state.preferences[contextName]
? state.preferences[contextName].hotKeysData
: {}
};
};
const mapDispatchToProps = dispatch => {
return {
onCancel: () => {
dispatch(setUserPreferencesModalOpen(false));
},
onSave: data => {
const contextName = window.store.getState().commandContext.context;
const preferences = cloneDeep(window.store.getState().preferences);
preferences[contextName] = data;
dispatch(setUserPreferences(preferences));
dispatch(setUserPreferencesModalOpen(false));
OHIF.hotkeysUtil.setHotkeys(data.hotKeysData);
},
onResetToDefaults: () => {
dispatch(setUserPreferences());
dispatch(setUserPreferencesModalOpen(false));
OHIF.hotkeysUtil.setHotkeys();
}
};
};
const ConnectedUserPreferencesModal = connect(
mapStateToProps,
mapDispatchToProps
)(UserPreferencesModal);
export default ConnectedUserPreferencesModal;

View File

@ -4,13 +4,12 @@ import PropTypes from 'prop-types';
//import { CineDialog } from 'react-viewerbase'; //import { CineDialog } from 'react-viewerbase';
import WhiteLabellingContext from '../WhiteLabellingContext.js'; import WhiteLabellingContext from '../WhiteLabellingContext.js';
import Header from '../components/Header'; import ConnectedHeader from './ConnectedHeader.js';
import ConnectedFlexboxLayout from './ConnectedFlexboxLayout.js'; import ConnectedFlexboxLayout from './ConnectedFlexboxLayout.js';
import ConnectedToolbarRow from './ConnectedToolbarRow'; import ConnectedToolbarRow from './ConnectedToolbarRow.js';
import ConnectedStudyLoadingMonitor from './ConnectedStudyLoadingMonitor.js'; import ConnectedStudyLoadingMonitor from './ConnectedStudyLoadingMonitor.js';
import StudyPrefetcher from '../components/StudyPrefetcher.js'; import StudyPrefetcher from '../components/StudyPrefetcher.js';
import './Viewer.css'; import './Viewer.css';
/** /**
* Inits OHIF Hanging Protocol's onReady. * Inits OHIF Hanging Protocol's onReady.
* It waits for OHIF Hanging Protocol to be ready to instantiate the ProtocolEngine * It waits for OHIF Hanging Protocol to be ready to instantiate the ProtocolEngine
@ -57,7 +56,9 @@ class Viewer extends Component {
<> <>
<WhiteLabellingContext.Consumer> <WhiteLabellingContext.Consumer>
{whiteLabelling => ( {whiteLabelling => (
<Header home={false}>{whiteLabelling.logoComponent}</Header> <ConnectedHeader home={false}>
{whiteLabelling.logoComponent}
</ConnectedHeader>
)} )}
</WhiteLabellingContext.Consumer> </WhiteLabellingContext.Consumer>
<div id="viewer" className="Viewer"> <div id="viewer" className="Viewer">

View File

@ -7,16 +7,21 @@ import './ViewerMain.css';
class ViewerMain extends Component { class ViewerMain extends Component {
state = { state = {
viewportData: [], viewportData: []
}; };
static propTypes = { static propTypes = {
studies: PropTypes.array.isRequired studies: PropTypes.array.isRequired
}; };
constructor(props) {
super(props);
OHIF.hotkeysUtil.setup('viewer');
}
getDisplaySets(studies) { getDisplaySets(studies) {
const displaySets = []; const displaySets = [];
studies.forEach((study) => { studies.forEach(study => {
study.displaySets.forEach(dSet => { study.displaySets.forEach(dSet => {
displaySets.push(dSet); displaySets.push(dSet);
}); });
@ -59,14 +64,18 @@ class ViewerMain extends Component {
// would not trigger a re-render. We have to create a copy. // would not trigger a re-render. We have to create a copy.
const updatedViewportData = this.state.viewportData.slice(0); const updatedViewportData = this.state.viewportData.slice(0);
const displaySet = this.findDisplaySet(this.props.studies, item.studyInstanceUid, item.displaySetInstanceUid); const displaySet = this.findDisplaySet(
this.props.studies,
item.studyInstanceUid,
item.displaySetInstanceUid
);
updatedViewportData[viewportIndex] = Object.assign({}, displaySet); updatedViewportData[viewportIndex] = Object.assign({}, displaySet);
this.setState({ this.setState({
viewportData: updatedViewportData viewportData: updatedViewportData
}); });
} };
render() { render() {
return ( return (

View File

@ -8,9 +8,15 @@ export const setRightSidebarOpen = state => ({
state state
}); });
export const setUserPreferencesModalOpen = state => ({
type: 'SET_USER_PREFERENCES_MODAL_OPEN',
state
});
const actions = { const actions = {
setLeftSidebarOpen, setLeftSidebarOpen,
setRightSidebarOpen setRightSidebarOpen,
setUserPreferencesModalOpen
}; };
export default actions; export default actions;

View File

@ -0,0 +1,19 @@
export const loadState = () => {
try {
const serializedState = window.localStorage.getItem('state');
if (!serializedState) {
return undefined;
}
return JSON.parse(serializedState);
} catch (e) {
return undefined;
}
};
export const saveState = state => {
try {
const serializedState = JSON.stringify(state);
localStorage.setItem('state', serializedState);
} catch (e) {}
};

View File

@ -1,7 +1,8 @@
const defaultState = { const defaultState = {
leftSidebarOpen: true, leftSidebarOpen: true,
rightSidebarOpen: false, rightSidebarOpen: false,
} userPreferencesModalOpen: false
};
const ui = (state = defaultState, action) => { const ui = (state = defaultState, action) => {
switch (action.type) { switch (action.type) {
@ -9,6 +10,10 @@ const ui = (state = defaultState, action) => {
return Object.assign({}, state, { leftSidebarOpen: action.state }); return Object.assign({}, state, { leftSidebarOpen: action.state });
case 'SET_RIGHT_SIDEBAR_OPEN': case 'SET_RIGHT_SIDEBAR_OPEN':
return Object.assign({}, state, { rightSidebarOpen: action.state }); return Object.assign({}, state, { rightSidebarOpen: action.state });
case 'SET_USER_PREFERENCES_MODAL_OPEN':
return Object.assign({}, state, {
userPreferencesModalOpen: action.state
});
default: default:
return state; return state;
} }

View File

@ -1,9 +1,10 @@
import React, { Component } from "react"; import React, { Component } from 'react';
import PropTypes from "prop-types"; import PropTypes from 'prop-types';
import OHIF from 'ohif-core'; import OHIF from 'ohif-core';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import { StudyList } from "react-viewerbase"; import { StudyList } from 'react-viewerbase';
import Header from "../components/Header"; import Header from '../components/Header';
import ConnectedHeader from '../connectedComponents/ConnectedHeader.js';
class StudyListWithData extends Component { class StudyListWithData extends Component {
state = { state = {
@ -29,10 +30,12 @@ class StudyListWithData extends Component {
this.searchForStudies(); this.searchForStudies();
} }
searchForStudies = (searchData = { searchForStudies = (
searchData = {
currentPage: 0, currentPage: 0,
rowsPerPage: StudyListWithData.rowsPerPage rowsPerPage: StudyListWithData.rowsPerPage
}) => { }
) => {
const { server } = this.props; const { server } = this.props;
const filter = { const filter = {
patientId: searchData.patientId, patientId: searchData.patientId,
@ -40,15 +43,18 @@ class StudyListWithData extends Component {
accessionNumber: searchData.accessionNumber, accessionNumber: searchData.accessionNumber,
studyDescription: searchData.studyDescription, studyDescription: searchData.studyDescription,
modalitiesInStudy: searchData.modalitiesInStudy, modalitiesInStudy: searchData.modalitiesInStudy,
limit: searchData.currentPage * searchData.rowsPerPage + searchData.rowsPerPage, limit:
searchData.currentPage * searchData.rowsPerPage +
searchData.rowsPerPage,
offset: searchData.currentPage * searchData.rowsPerPage offset: searchData.currentPage * searchData.rowsPerPage
}; };
// TODO: add sorting // TODO: add sorting
const promise = OHIF.studies.searchStudies(server, filter) const promise = OHIF.studies.searchStudies(server, filter);
// Render the viewer when the data is ready // Render the viewer when the data is ready
promise.then(studies => { promise
.then(studies => {
if (!studies) { if (!studies) {
studies = []; studies = [];
} }
@ -59,52 +65,56 @@ class StudyListWithData extends Component {
fixedStudy.studyInstanceUID = study.studyInstanceUid; fixedStudy.studyInstanceUID = study.studyInstanceUid;
return fixedStudy; return fixedStudy;
}) });
this.setState({ this.setState({
studies: fixedStudies, studies: fixedStudies
}); });
}).catch(error => { })
.catch(error => {
this.setState({ this.setState({
error: true, error: true
}); });
throw new Error(error); throw new Error(error);
}); });
} };
onImport = () => { onImport = () => {
//console.log('onImport'); //console.log('onImport');
} };
onSelectItem = (studyInstanceUID) => { onSelectItem = studyInstanceUID => {
this.props.history.push(`/viewer/${studyInstanceUID}`); this.props.history.push(`/viewer/${studyInstanceUID}`);
} };
onSearch = (searchData) => { onSearch = searchData => {
// TODO: Update search filters // TODO: Update search filters
this.searchForStudies(searchData); this.searchForStudies(searchData);
} };
render() { render() {
if (this.state.error) { if (this.state.error) {
return (<div>Error: {JSON.stringify(this.state.error)}</div>); return <div>Error: {JSON.stringify(this.state.error)}</div>;
} else if (this.state.studies === null) { } else if (this.state.studies === null) {
return (<div>Loading...</div>); return <div>Loading...</div>;
} }
const studyCount = this.state.studies ? this.state.studies.length : 0; const studyCount = this.state.studies ? this.state.studies.length : 0;
return (<> return (
<Header home={true} user={this.props.user}/> <>
<StudyList studies={this.state.studies} <ConnectedHeader home={true} user={this.props.user} />
<StudyList
studies={this.state.studies}
studyCount={studyCount} studyCount={studyCount}
studyListFunctionsEnabled={false} studyListFunctionsEnabled={false}
onImport={this.onImport} onImport={this.onImport}
onSelectItem={this.onSelectItem} onSelectItem={this.onSelectItem}
pageSize={this.rowsPerPage} pageSize={this.rowsPerPage}
defaultSort={StudyListWithData.defaultSort} defaultSort={StudyListWithData.defaultSort}
onSearch={this.onSearch} /> onSearch={this.onSearch}
/>
</> </>
); );
} }